source: trunk/zoo-project/zoo-kernel/service_internal.c @ 393

Last change on this file since 393 was 393, checked in by djay, 11 years ago

Remove temporary file created when running service in background. Make compilation of JAVA support works using XCode 4.4.

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc
File size: 73.1 KB
RevLine 
[1]1/**
2 * Author : Gérald FENOY
3 *
[392]4 * Copyright (c) 2009-2013 GeoLabs SARL
[1]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"
[364]26#ifdef USE_MS
27#include "service_internal_ms.h"
[216]28#endif
29
[365]30#ifndef TRUE
31#define TRUE 1
32#endif
33#ifndef FALSE
34#define FALSE -1
35#endif
36
[375]37void printHeaders(maps* m){
38  maps *_tmp=getMaps(m,"headers");
39  if(_tmp!=NULL){
40    map* _tmp1=_tmp->content;
41    while(_tmp1!=NULL){
42      printf("%s: %s\r\n",_tmp1->name,_tmp1->value);
43      _tmp1=_tmp1->next;
44    }
45  }
46}
47
[216]48void addLangAttr(xmlNodePtr n,maps *m){
[34]49  map *tmpLmap=getMapFromMaps(m,"main","language");
50  if(tmpLmap!=NULL)
51    xmlNewProp(n,BAD_CAST "xml:lang",BAD_CAST tmpLmap->value);
52  else
53    xmlNewProp(n,BAD_CAST "xml:lang",BAD_CAST "en-US");
54}
55
[1]56/* Converts a hex character to its integer value */
57char from_hex(char ch) {
58  return isdigit(ch) ? ch - '0' : tolower(ch) - 'a' + 10;
59}
60
61/* Converts an integer value to its hex character*/
62char to_hex(char code) {
63  static char hex[] = "0123456789abcdef";
64  return hex[code & 15];
65}
66
[216]67#ifdef WIN32
68
69#include <windows.h>
70#include <stdio.h>
71#include <conio.h>
72#include <tchar.h>
73
74#define SHMEMSIZE 4096
75
76static LPVOID lpvMemG = NULL;      // pointer to shared memory
77static HANDLE hMapObjectG = NULL;  // handle to file mapping
78
79void updateStatus(maps *conf){
[384]80  LPWSTR lpszTmp;
81  BOOL fInit;
82  char *s=NULL;
83  map *tmpMap=getMapFromMaps(conf,"lenv","sid");
84  if(hMapObjectG==NULL)
85    hMapObjectG = CreateFileMapping( 
86                                    INVALID_HANDLE_VALUE,   // use paging file
87                                    NULL,                   // default security attributes
88                                    PAGE_READWRITE,         // read/write access
89                                    0,                      // size: high 32-bits
90                                    SHMEMSIZE,              // size: low 32-bits
91                                    TEXT(tmpMap->value));   // name of map object
92  if (hMapObjectG == NULL){
93    fprintf(stderr,"Unable to create share memory segment %s !! \n",tmpMap->value);
94    return ;
95  }
96  fInit = (GetLastError() != ERROR_ALREADY_EXISTS); 
97  if(lpvMemG==NULL)
98    lpvMemG = MapViewOfFile( 
99                            hMapObjectG,     // object to map view of
100                            FILE_MAP_WRITE, // read/write access
101                            0,              // high offset:  map from
102                            0,              // low offset:   beginning
103                            0);             // default: map entire file
104  if (lpvMemG == NULL){
105    fprintf(stderr,"Unable to create or access the shared memory segment %s !! \n",tmpMap->value);
106    return ;
107  } 
108  if (fInit)
109    memset(lpvMemG, '\0', SHMEMSIZE);
110  tmpMap=getMapFromMaps(conf,"lenv","status");
111  lpszTmp = (LPWSTR) lpvMemG;
112  for(s=tmpMap->value;*s!=NULL;s++)
113    *lpszTmp++ = *s;
114  *lpszTmp = '\0'; 
[216]115}
116
117char* getStatus(int pid){
118  LPWSTR lpszBuf=NULL;
119  LPWSTR lpszTmp=NULL;
120  LPVOID lpvMem = NULL;
121  HANDLE hMapObject = NULL;
122  BOOL fIgnore,fInit;
123  char tmp[100];
124  sprintf(tmp,"%i",pid);
125  if(hMapObject==NULL)
126    hMapObject = CreateFileMapping( 
127                                   INVALID_HANDLE_VALUE,   // use paging file
128                                   NULL,                   // default security attributes
129                                   PAGE_READWRITE,         // read/write access
130                                   0,                      // size: high 32-bits
131                                   4096,                   // size: low 32-bits
132                                   TEXT(tmp));   // name of map object
133  if (hMapObject == NULL) 
134    return FALSE;
135  if((GetLastError() != ERROR_ALREADY_EXISTS)){
136    fIgnore = UnmapViewOfFile(lpvMem); 
137    fIgnore = CloseHandle(hMapObject);
138    return "-1";
139  }
140  fInit=TRUE;
141  if(lpvMem==NULL)
142    lpvMem = MapViewOfFile( 
143                           hMapObject,     // object to map view of
144                           FILE_MAP_READ,  // read/write access
145                           0,              // high offset:  map from
146                           0,              // low offset:   beginning
147                           0);             // default: map entire file
148  if (lpvMem == NULL) 
149    return "-1"; 
150  lpszTmp = (LPWSTR) lpvMem;
[384]151  return (char*)lpszTmp;
[216]152}
153
154void unhandleStatus(maps *conf){
155  BOOL fIgnore;
156  fIgnore = UnmapViewOfFile(lpvMemG); 
157  fIgnore = CloseHandle(hMapObjectG);
158}
159#else
[255]160
[216]161void unhandleStatus(maps *conf){
[26]162  int shmid,i;
163  key_t key;
164  void *shm;
165  struct shmid_ds shmids;
166  char *s,*s1;
167  map *tmpMap=getMapFromMaps(conf,"lenv","sid");
168  if(tmpMap!=NULL){
169    key=atoi(tmpMap->value);
170    if ((shmid = shmget(key, SHMSZ, IPC_CREAT | 0666)) < 0) {
171#ifdef DEBUG
172      fprintf(stderr,"shmget failed to update value\n");
173#endif
174    }else{
175      if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) {
176#ifdef DEBUG
177        fprintf(stderr,"shmat failed to update value\n");
178#endif
179      }else{
180        shmdt(shm);
181        shmctl(shmid,IPC_RMID,&shmids);
182      }
183    }
184  }
185}
186
[216]187void updateStatus(maps *conf){
[26]188  int shmid,i;
189  key_t key;
190  char *shm,*s,*s1;
191  map *tmpMap=NULL;
192  tmpMap=getMapFromMaps(conf,"lenv","sid");
193  if(tmpMap!=NULL){
194    key=atoi(tmpMap->value);
195    if ((shmid = shmget(key, SHMSZ, IPC_CREAT | 0666)) < 0) {
196#ifdef DEBUG
[255]197      fprintf(stderr,"shmget failed to create new Shared memory segment\n");
[26]198#endif
199    }else{
200      if ((shm = (char*) shmat(shmid, NULL, 0)) == (char *) -1) {
201#ifdef DEBUG
202        fprintf(stderr,"shmat failed to update value\n");
203#endif
204      }
205      else{
206        tmpMap=getMapFromMaps(conf,"lenv","status");
207        s1=shm;
[255]208        for(s=tmpMap->value;*s!=NULL && *s!=0;s++){
[26]209          *s1++=*s;
[255]210        }
211        *s1=NULL;
[26]212        shmdt((void *)shm);
213      }
214    }
215  }
216}
217
218char* getStatus(int pid){
219  int shmid,i;
220  key_t key;
221  void *shm;
222  char *s;
223  key=pid;
224  if ((shmid = shmget(key, SHMSZ, 0666)) < 0) {
225#ifdef DEBUG
226    fprintf(stderr,"shmget failed in getStatus\n");
227#endif
228  }else{
229    if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) {
230#ifdef DEBUG
231      fprintf(stderr,"shmat failed in getStatus\n");
232#endif
233    }else{
234      return (char*)shm;
235    }
236  }
237  return "-1";
238}
239
[216]240#endif
[26]241
[216]242#ifdef USE_JS
243
244JSBool
[274]245JSUpdateStatus(JSContext *cx, uintN argc, jsval *argv1)
[216]246{
[274]247  jsval *argv = JS_ARGV(cx,argv1);
[216]248  JS_MaybeGC(cx);
249  char *sid;
250  int istatus=0;
251  char *status=NULL;
252  maps *conf;
253  int i=0;
254  if(argc>2){
255#ifdef JS_DEBUG
256    fprintf(stderr,"Number of arguments used to call the function : %i",argc);
257#endif
258    return JS_FALSE;
259  }
260  conf=mapsFromJSObject(cx,argv[0]);
261  if(JS_ValueToInt32(cx,argv[1],&istatus)==JS_TRUE){
262    char tmpStatus[4];
263    sprintf(tmpStatus,"%i",istatus);
264    tmpStatus[3]=0;
265    status=strdup(tmpStatus);
266  }
267  if(getMapFromMaps(conf,"lenv","status")!=NULL){
[274]268    fprintf(stderr,"STATUS RETURNED : %s\n",status);
269    if(status!=NULL){
[216]270      setMapInMaps(conf,"lenv","status",status);
[274]271      free(status);
272    }
[216]273    else
274      setMapInMaps(conf,"lenv","status","15");
275    updateStatus(conf);
276  }
277  freeMaps(&conf);
278  free(conf);
279  JS_MaybeGC(cx);
280  return JS_TRUE;
281}
282
283#endif
284
285
286
[1]287/* Returns a url-encoded version of str */
288/* IMPORTANT: be sure to free() the returned string after use */
289char *url_encode(char *str) {
290  char *pstr = str, *buf = (char*) malloc(strlen(str) * 3 + 1), *pbuf = buf;
291  while (*pstr) {
292    if (isalnum(*pstr) || *pstr == '-' || *pstr == '_' || *pstr == '.' || *pstr == '~') 
293      *pbuf++ = *pstr;
294    else if (*pstr == ' ') 
295      *pbuf++ = '+';
296    else 
297      *pbuf++ = '%', *pbuf++ = to_hex(*pstr >> 4), *pbuf++ = to_hex(*pstr & 15);
298    pstr++;
299  }
300  *pbuf = '\0';
301  return buf;
302}
303
304/* Returns a url-decoded version of str */
305/* IMPORTANT: be sure to free() the returned string after use */
306char *url_decode(char *str) {
307  char *pstr = str, *buf = (char*) malloc(strlen(str) + 1), *pbuf = buf;
308  while (*pstr) {
309    if (*pstr == '%') {
310      if (pstr[1] && pstr[2]) {
311        *pbuf++ = from_hex(pstr[1]) << 4 | from_hex(pstr[2]);
312        pstr += 2;
313      }
314    } else if (*pstr == '+') { 
315      *pbuf++ = ' ';
316    } else {
317      *pbuf++ = *pstr;
318    }
319    pstr++;
320  }
321  *pbuf = '\0';
322  return buf;
323}
324
[9]325char *zCapitalize1(char *tmp){
326        char *res=strdup(tmp);
327        if(res[0]>=97 && res[0]<=122)
328                res[0]-=32;
329        return res;
330}
[1]331
[9]332char *zCapitalize(char *tmp){
333  int i=0;
334  char *res=strdup(tmp);
335  for(i=0;i<strlen(res);i++)
336    if(res[i]>=97 && res[i]<=122)
337      res[i]-=32;
338  return res;
339}
[1]340
[9]341
[114]342int zooXmlSearchForNs(const char* name){
[9]343  int i;
344  int res=-1;
345  for(i=0;i<nbNs;i++)
346    if(strncasecmp(name,nsName[i],strlen(nsName[i]))==0){
347      res=i;
348      break;
[1]349    }
[9]350  return res;
351}
[1]352
[114]353int zooXmlAddNs(xmlNodePtr nr,const char* url,const char* name){
[1]354#ifdef DEBUG
[9]355  fprintf(stderr,"zooXmlAddNs %d \n",nbNs);
[1]356#endif
[9]357  int currId=-1;
[280]358  int currNode=-1;
[9]359  if(nbNs==0){
360    nbNs++;
361    currId=0;
362    nsName[currId]=strdup(name);
363    usedNs[currId]=xmlNewNs(nr,BAD_CAST url,BAD_CAST name);
364  }else{
365    currId=zooXmlSearchForNs(name);
366    if(currId<0){
367      nbNs++;
368      currId=nbNs-1;
369      nsName[currId]=strdup(name);
370      usedNs[currId]=xmlNewNs(nr,BAD_CAST url,BAD_CAST name);
[1]371    }
[9]372  }
373  return currId;
374}
[1]375
[9]376void zooXmlCleanupNs(){
377  int j;
[1]378#ifdef DEBUG
[9]379  fprintf(stderr,"zooXmlCleanup %d\n",nbNs);
[1]380#endif
[9]381  for(j=nbNs-1;j>=0;j--){
[1]382#ifdef DEBUG
[9]383    fprintf(stderr,"zooXmlCleanup %d\n",j);
[1]384#endif
[9]385    if(j==0)
386      xmlFreeNs(usedNs[j]);
387    free(nsName[j]);
388    nbNs--;
[1]389  }
[9]390  nbNs=0;
[1]391}
392
[280]393xmlNodePtr soapEnvelope(maps* conf,xmlNodePtr n){
394  map* soap=getMapFromMaps(conf,"main","isSoap");
395  if(soap!=NULL && strcasecmp(soap->value,"true")==0){
396    int lNbNs=nbNs;
397    nsName[lNbNs]=strdup("soap");
398    usedNs[lNbNs]=xmlNewNs(NULL,BAD_CAST "http://www.w3.org/2003/05/soap-envelope",BAD_CAST "soap");
399    nbNs++;
400    xmlNodePtr nr = xmlNewNode(usedNs[lNbNs], BAD_CAST "Envelope");
401    nsName[nbNs]=strdup("soap");
402    usedNs[nbNs]=xmlNewNs(nr,BAD_CAST "http://www.w3.org/2003/05/soap-envelope",BAD_CAST "soap");
403    nbNs++;
404    nsName[nbNs]=strdup("xsi");
405    usedNs[nbNs]=xmlNewNs(nr,BAD_CAST "http://www.w3.org/2001/XMLSchema-instance",BAD_CAST "xsi");
406    nbNs++;
407    xmlNsPtr ns_xsi=usedNs[nbNs-1];
408    xmlNewNsProp(nr,ns_xsi,BAD_CAST "schemaLocation",BAD_CAST "http://www.w3.org/2003/05/soap-envelope http://www.w3.org/2003/05/soap-envelope");
409    xmlNodePtr nr1 = xmlNewNode(usedNs[lNbNs], BAD_CAST "Body");
410    xmlAddChild(nr1,n);
411    xmlAddChild(nr,nr1);
412    return nr;
413  }else
414    return n;
415}
416
[114]417xmlNodePtr printGetCapabilitiesHeader(xmlDocPtr doc,const char* service,maps* m){
[1]418
419  xmlNsPtr ns,ns_ows,ns_xlink,ns_xsi;
[9]420  xmlNodePtr n,nc,nc1,nc2,nc3,nc4,nc5,nc6,pseudor;
[1]421  xmlChar *xmlbuff;
422  int buffersize;
423  /**
424   * Create the document and its temporary root.
425   */
[9]426  int wpsId=zooXmlAddNs(NULL,"http://www.opengis.net/wps/1.0.0","wps");
427  ns=usedNs[wpsId];
[1]428  maps* toto1=getMaps(m,"main");
429
[9]430  n = xmlNewNode(ns, BAD_CAST "Capabilities");
431  int owsId=zooXmlAddNs(n,"http://www.opengis.net/ows/1.1","ows");
432  ns_ows=usedNs[owsId];
[1]433  xmlNewNs(n,BAD_CAST "http://www.opengis.net/wps/1.0.0",BAD_CAST "wps");
[9]434  int xsiId=zooXmlAddNs(n,"http://www.w3.org/2001/XMLSchema-instance","xsi");
435  ns_xsi=usedNs[xsiId];
436  int xlinkId=zooXmlAddNs(n,"http://www.w3.org/1999/xlink","xlink");
437  ns_xlink=usedNs[xlinkId];
438  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"); 
[1]439  xmlNewProp(n,BAD_CAST "service",BAD_CAST "WPS");
[34]440  addLangAttr(n,m);
[1]441 
442  if(toto1!=NULL){
443    map* tmp=getMap(toto1->content,"version");
444    if(tmp!=NULL){
445      xmlNewProp(n,BAD_CAST "version",BAD_CAST tmp->value);
446    }
447    else
448      xmlNewProp(n,BAD_CAST "version",BAD_CAST "1.0.0");
449  }
450  else
451    xmlNewProp(n,BAD_CAST "version",BAD_CAST "1.0.0");
452
453  char tmp[256];
454 
455  nc = xmlNewNode(ns_ows, BAD_CAST "ServiceIdentification");
456  maps* tmp4=getMaps(m,"identification");
457  if(tmp4!=NULL){
458    map* tmp2=tmp4->content;
[71]459    char *orderedFields[5];
460    orderedFields[0]="Title";
461    orderedFields[1]="Abstract";
462    orderedFields[2]="Keywords";
463    orderedFields[3]="Fees";
464    orderedFields[4]="AccessConstraints";
465    int oI=0;
466    for(oI=0;oI<5;oI++)
467      if((tmp2=getMap(tmp4->content,orderedFields[oI]))!=NULL){
468        if(strcasecmp(tmp2->name,"abstract")==0 ||
469           strcasecmp(tmp2->name,"title")==0 ||
470           strcasecmp(tmp2->name,"accessConstraints")==0 ||
471           strcasecmp(tmp2->name,"fees")==0){
472          tmp2->name[0]=toupper(tmp2->name[0]);
473          nc1 = xmlNewNode(ns_ows, BAD_CAST tmp2->name);
474          xmlAddChild(nc1,xmlNewText(BAD_CAST tmp2->value));
475          xmlAddChild(nc,nc1);
476        }
477        else
478          if(strcmp(tmp2->name,"keywords")==0){
479            nc1 = xmlNewNode(ns_ows, BAD_CAST "Keywords");
480            char *toto=tmp2->value;
481            char buff[256];
482            int i=0;
483            int j=0;
484            while(toto[i]){
485              if(toto[i]!=',' && toto[i]!=0){
486                buff[j]=toto[i];
487                buff[j+1]=0;
488                j++;
489              }
490              else{
491                nc2 = xmlNewNode(ns_ows, BAD_CAST "Keyword");
492                xmlAddChild(nc2,xmlNewText(BAD_CAST buff));           
493                xmlAddChild(nc1,nc2);
494                j=0;
495              }
496              i++;
[1]497            }
[71]498            if(strlen(buff)>0){
[1]499              nc2 = xmlNewNode(ns_ows, BAD_CAST "Keyword");
500              xmlAddChild(nc2,xmlNewText(BAD_CAST buff));             
501              xmlAddChild(nc1,nc2);
502            }
[71]503            xmlAddChild(nc,nc1);
504            nc2 = xmlNewNode(ns_ows, BAD_CAST "ServiceType");
505            xmlAddChild(nc2,xmlNewText(BAD_CAST "WPS"));
506            xmlAddChild(nc,nc2);
507            nc2 = xmlNewNode(ns_ows, BAD_CAST "ServiceTypeVersion");
508            xmlAddChild(nc2,xmlNewText(BAD_CAST "1.0.0"));
509            xmlAddChild(nc,nc2);         
[1]510          }
[71]511        tmp2=tmp2->next;
512      }
[1]513  }
514  else{
515    fprintf(stderr,"TMP4 NOT FOUND !!");
516    return NULL;
517  }
518  xmlAddChild(n,nc);
519
520  nc = xmlNewNode(ns_ows, BAD_CAST "ServiceProvider");
521  nc3 = xmlNewNode(ns_ows, BAD_CAST "ServiceContact");
522  nc4 = xmlNewNode(ns_ows, BAD_CAST "ContactInfo");
523  nc5 = xmlNewNode(ns_ows, BAD_CAST "Phone");
524  nc6 = xmlNewNode(ns_ows, BAD_CAST "Address");
525  tmp4=getMaps(m,"provider");
526  if(tmp4!=NULL){
527    map* tmp2=tmp4->content;
[57]528    char *tmpAddress[6];
529    tmpAddress[0]="addressDeliveryPoint";
530    tmpAddress[1]="addressCity";
531    tmpAddress[2]="addressAdministrativeArea";
532    tmpAddress[3]="addressPostalCode";
533    tmpAddress[4]="addressCountry";
534    tmpAddress[5]="addressElectronicMailAddress";
535    char *tmpPhone[2];
536    tmpPhone[0]="phoneVoice";
537    tmpPhone[1]="phoneFacsimile";
[71]538    char *orderedFields[12];
539    orderedFields[0]="providerName";
540    orderedFields[1]="providerSite";
541    orderedFields[2]="individualName";
542    orderedFields[3]="positionName";
543    orderedFields[4]=tmpPhone[0];
544    orderedFields[5]=tmpPhone[1];
545    orderedFields[6]=tmpAddress[0];
546    orderedFields[7]=tmpAddress[1];
547    orderedFields[8]=tmpAddress[2];
548    orderedFields[9]=tmpAddress[3];
549    orderedFields[10]=tmpAddress[4];
550    orderedFields[11]=tmpAddress[5];
551    int oI=0;
552    for(oI=0;oI<12;oI++)
553      if((tmp2=getMap(tmp4->content,orderedFields[oI]))!=NULL){
554        if(strcmp(tmp2->name,"keywords")!=0 &&
555           strcmp(tmp2->name,"serverAddress")!=0 &&
556           strcmp(tmp2->name,"lang")!=0){
557          tmp2->name[0]=toupper(tmp2->name[0]);
558          if(strcmp(tmp2->name,"ProviderName")==0){
[1]559            nc1 = xmlNewNode(ns_ows, BAD_CAST tmp2->name);
[71]560            xmlAddChild(nc1,xmlNewText(BAD_CAST tmp2->value));
[1]561            xmlAddChild(nc,nc1);
[71]562          }
563          else{
564            if(strcmp(tmp2->name,"ProviderSite")==0){
[1]565              nc1 = xmlNewNode(ns_ows, BAD_CAST tmp2->name);
[71]566              xmlNewNsProp(nc1,ns_xlink,BAD_CAST "href",BAD_CAST tmp2->value);
567              xmlAddChild(nc,nc1);
[1]568            } 
[71]569            else 
570              if(strcmp(tmp2->name,"IndividualName")==0 || 
571                 strcmp(tmp2->name,"PositionName")==0){
572                nc1 = xmlNewNode(ns_ows, BAD_CAST tmp2->name);
573                xmlAddChild(nc1,xmlNewText(BAD_CAST tmp2->value));
574                xmlAddChild(nc3,nc1);
575              } 
[1]576              else 
[71]577                if(strncmp(tmp2->name,"Phone",5)==0){
[57]578                  int j;
[71]579                  for(j=0;j<2;j++)
580                    if(strcasecmp(tmp2->name,tmpPhone[j])==0){
[57]581                      char *toto=NULL;
582                      char *toto1=tmp2->name;
[71]583                      toto=strstr(toto1,"Phone");
584                      nc1 = xmlNewNode(ns_ows, BAD_CAST toto1+5);
[57]585                      xmlAddChild(nc1,xmlNewText(BAD_CAST tmp2->value));
[71]586                      xmlAddChild(nc5,nc1);
[57]587                    }
[1]588                }
[71]589                else 
590                  if(strncmp(tmp2->name,"Address",7)==0){
591                    int j;
592                    for(j=0;j<6;j++)
593                      if(strcasecmp(tmp2->name,tmpAddress[j])==0){
594                        char *toto=NULL;
595                        char *toto1=tmp2->name;
596                        toto=strstr(toto1,"Address");
597                        nc1 = xmlNewNode(ns_ows, BAD_CAST toto1+7);
598                        xmlAddChild(nc1,xmlNewText(BAD_CAST tmp2->value));
599                        xmlAddChild(nc6,nc1);
600                      }
601                  }
602          }
[1]603        }
[71]604        else
605          if(strcmp(tmp2->name,"keywords")==0){
606            nc1 = xmlNewNode(ns_ows, BAD_CAST "Keywords");
607            char *toto=tmp2->value;
608            char buff[256];
609            int i=0;
610            int j=0;
611            while(toto[i]){
612              if(toto[i]!=',' && toto[i]!=0){
613                buff[j]=toto[i];
614                buff[j+1]=0;
615                j++;
616              }
617              else{
618                nc2 = xmlNewNode(ns_ows, BAD_CAST "Keyword");
619                xmlAddChild(nc2,xmlNewText(BAD_CAST buff));           
620                xmlAddChild(nc1,nc2);
621                j=0;
622              }
623              i++;
[1]624            }
[71]625            if(strlen(buff)>0){
[1]626              nc2 = xmlNewNode(ns_ows, BAD_CAST "Keyword");
627              xmlAddChild(nc2,xmlNewText(BAD_CAST buff));             
628              xmlAddChild(nc1,nc2);
629            }
[71]630            xmlAddChild(nc,nc1);
[1]631          }
[71]632        tmp2=tmp2->next;
633      }
[1]634  }
635  else{
636    fprintf(stderr,"TMP4 NOT FOUND !!");
637  }
638  xmlAddChild(nc4,nc5);
639  xmlAddChild(nc4,nc6);
640  xmlAddChild(nc3,nc4);
641  xmlAddChild(nc,nc3);
642  xmlAddChild(n,nc);
643
644
645  nc = xmlNewNode(ns_ows, BAD_CAST "OperationsMetadata");
646  char *tmp2[3];
[9]647  tmp2[0]=strdup("GetCapabilities");
648  tmp2[1]=strdup("DescribeProcess");
649  tmp2[2]=strdup("Execute");
[1]650  int j=0;
651
652  if(toto1!=NULL){
653    map* tmp=getMap(toto1->content,"serverAddress");
654    if(tmp!=NULL){
655      SERVICE_URL = strdup(tmp->value);
656    }
657    else
[9]658      SERVICE_URL = strdup("not_found");
[1]659  }
660  else
[9]661    SERVICE_URL = strdup("not_found");
[1]662
663  for(j=0;j<3;j++){
664    nc1 = xmlNewNode(ns_ows, BAD_CAST "Operation");
665    xmlNewProp(nc1,BAD_CAST "name",BAD_CAST tmp2[j]);
666    nc2 = xmlNewNode(ns_ows, BAD_CAST "DCP");
667    nc3 = xmlNewNode(ns_ows, BAD_CAST "HTTP");
668    nc4 = xmlNewNode(ns_ows, BAD_CAST "Get");
669    sprintf(tmp,"%s/%s",SERVICE_URL,service);
[9]670    xmlNewNsProp(nc4,ns_xlink,BAD_CAST "href",BAD_CAST tmp);
[1]671    xmlAddChild(nc3,nc4);
672    if(j>0){
673      nc4 = xmlNewNode(ns_ows, BAD_CAST "Post");
[9]674      xmlNewNsProp(nc4,ns_xlink,BAD_CAST "href",BAD_CAST tmp);
[1]675      xmlAddChild(nc3,nc4);
676    }
677    xmlAddChild(nc2,nc3);
678    xmlAddChild(nc1,nc2);   
679    xmlAddChild(nc,nc1);   
680  }
[9]681  for(j=2;j>=0;j--)
682    free(tmp2[j]);
[1]683  xmlAddChild(n,nc);
684
685  nc = xmlNewNode(ns, BAD_CAST "ProcessOfferings");
686  xmlAddChild(n,nc);
687
688  nc1 = xmlNewNode(ns, BAD_CAST "Languages");
689  nc2 = xmlNewNode(ns, BAD_CAST "Default");
690  nc3 = xmlNewNode(ns, BAD_CAST "Supported");
691 
692  toto1=getMaps(m,"main");
693  if(toto1!=NULL){
694    map* tmp1=getMap(toto1->content,"lang");
695    char *toto=tmp1->value;
696    char buff[256];
697    int i=0;
698    int j=0;
699    int dcount=0;
700    while(toto[i]){
701      if(toto[i]!=',' && toto[i]!=0){
702        buff[j]=toto[i];
703        buff[j+1]=0;
704        j++;
705      }
706      else{
707        nc4 = xmlNewNode(ns_ows, BAD_CAST "Language");
708        xmlAddChild(nc4,xmlNewText(BAD_CAST buff));
709        if(dcount==0){
710          xmlAddChild(nc2,nc4);
711          xmlAddChild(nc1,nc2);
712          dcount++;
713        }
714        nc4 = xmlNewNode(ns_ows, BAD_CAST "Language");
715        xmlAddChild(nc4,xmlNewText(BAD_CAST buff));
716        xmlAddChild(nc3,nc4);
717        j=0;
718        buff[j]=0;
719      }
720      i++;
721    }
722    if(strlen(buff)>0){
723      nc4 = xmlNewNode(ns_ows, BAD_CAST "Language");
724      xmlAddChild(nc4,xmlNewText(BAD_CAST buff));             
725      xmlAddChild(nc3,nc4);
726    }
727  }
728  xmlAddChild(nc1,nc3);
729  xmlAddChild(n,nc1);
730 
[280]731  xmlNodePtr fn=soapEnvelope(m,n);
732  xmlDocSetRootElement(doc, fn);
[9]733  //xmlFreeNs(ns);
734  free(SERVICE_URL);
[1]735  return nc;
736}
737
738void printGetCapabilitiesForProcess(maps* m,xmlNodePtr nc,service* serv){
[9]739  xmlNsPtr ns,ns_ows,ns_xlink;
[1]740  xmlNodePtr nr,n,nc1,nc2,nc3,nc4,nc5,nc6,pseudor;
[9]741  /**
742   * Initialize or get existing namspaces
743   */
744  int wpsId=zooXmlAddNs(NULL,"http://www.opengis.net/wps/1.0.0","wps");
745  ns=usedNs[wpsId];
746  int owsId=zooXmlAddNs(NULL,"http://www.opengis.net/ows/1.1","ows");
747  ns_ows=usedNs[owsId];
748  int xlinkId=zooXmlAddNs(n,"http://www.w3.org/1999/xlink","xlink");
749  ns_xlink=usedNs[xlinkId];
[1]750
751  int cursor=0;
752  map* tmp1;
753  if(serv->content!=NULL){
754    nc1 = xmlNewNode(ns, BAD_CAST "Process");
755    tmp1=getMap(serv->content,"processVersion");
756    if(tmp1!=NULL)
[9]757      xmlNewNsProp(nc1,ns,BAD_CAST "processVersion",BAD_CAST tmp1->value);
[1]758    printDescription(nc1,ns_ows,serv->name,serv->content);
759    tmp1=serv->metadata;
760    while(tmp1!=NULL){
761      nc2 = xmlNewNode(ns_ows, BAD_CAST "Metadata");
[9]762      xmlNewNsProp(nc2,ns_xlink,BAD_CAST tmp1->name,BAD_CAST tmp1->value);
[1]763      xmlAddChild(nc1,nc2);
764      tmp1=tmp1->next;
765    }
766    xmlAddChild(nc,nc1);
767  }
768}
769
[114]770xmlNodePtr printDescribeProcessHeader(xmlDocPtr doc,const char* service,maps* m){
[1]771
772  xmlNsPtr ns,ns_ows,ns_xlink,ns_xsi;
773  xmlNodePtr n,nr;
774  xmlChar *xmlbuff;
775  int buffersize;
776
[9]777  int wpsId=zooXmlAddNs(NULL,"http://schemas.opengis.net/wps/1.0.0","wps");
778  ns=usedNs[wpsId];
779  n = xmlNewNode(ns, BAD_CAST "ProcessDescriptions");
780  int owsId=zooXmlAddNs(n,"http://www.opengis.net/ows/1.1","ows");
781  ns_ows=usedNs[owsId];
[1]782  xmlNewNs(n,BAD_CAST "http://www.opengis.net/wps/1.0.0",BAD_CAST "wps");
[9]783  zooXmlAddNs(n,"http://www.w3.org/1999/xlink","xlink");
784  int xsiId=zooXmlAddNs(n,"http://www.w3.org/2001/XMLSchema-instance","xsi");
785  ns_xsi=usedNs[xsiId];
786 
787  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");
[1]788  xmlNewProp(n,BAD_CAST "service",BAD_CAST "WPS");
789  xmlNewProp(n,BAD_CAST "version",BAD_CAST "1.0.0");
[34]790  addLangAttr(n,m);
[1]791
[280]792  xmlNodePtr fn=soapEnvelope(m,n);
793  xmlDocSetRootElement(doc, fn);
[1]794
795  return n;
796}
797
[9]798void printDescribeProcessForProcess(maps* m,xmlNodePtr nc,service* serv,int sc){
[1]799  xmlNsPtr ns,ns_ows,ns_xlink,ns_xsi;
800  xmlNodePtr nr,n,nc1,nc2,nc3,nc4,nc5,nc6,pseudor;
801
802  char tmp[256];
803  n=nc;
804 
[9]805  int wpsId=zooXmlAddNs(NULL,"http://schemas.opengis.net/wps/1.0.0","wps");
806  ns=usedNs[wpsId];
807  int owsId=zooXmlAddNs(NULL,"http://www.opengis.net/ows/1.1","ows");
808  ns_ows=usedNs[owsId];
809  int xlinkId=zooXmlAddNs(NULL,"http://www.w3.org/1999/xlink","xlink");
810  ns_xlink=usedNs[xlinkId];
[1]811
812  nc = xmlNewNode(NULL, BAD_CAST "ProcessDescription");
813  char *tmp4[3];
814  tmp4[0]="processVersion";
815  tmp4[1]="storeSupported";
816  tmp4[2]="statusSupported";
817  int j=0;
818  map* tmp1=NULL;
819  for(j=0;j<3;j++){
[9]820    tmp1=getMap(serv->content,tmp4[j]);
[1]821    if(tmp1!=NULL){
822      if(j==0)
[9]823        xmlNewNsProp(nc,ns,BAD_CAST "processVersion",BAD_CAST tmp1->value);     
[1]824      else
825        xmlNewProp(nc,BAD_CAST tmp4[j],BAD_CAST tmp1->value);     
826    }
827    else{
828      if(j>0)
829        xmlNewProp(nc,BAD_CAST tmp4[j],BAD_CAST "false");     
830    }
831  }
832 
[9]833  printDescription(nc,ns_ows,serv->name,serv->content);
[1]834
[9]835  tmp1=serv->metadata;
[1]836  while(tmp1!=NULL){
837    nc1 = xmlNewNode(ns_ows, BAD_CAST "Metadata");
[9]838    xmlNewNsProp(nc1,ns_xlink,BAD_CAST tmp1->name,BAD_CAST tmp1->value);
[1]839    xmlAddChild(nc,nc1);
840    tmp1=tmp1->next;
841  }
842
[9]843  tmp1=getMap(serv->content,"Profile");
[1]844  if(tmp1!=NULL){
845    nc1 = xmlNewNode(ns, BAD_CAST "Profile");
846    xmlAddChild(nc1,xmlNewText(BAD_CAST tmp1->value));
847    xmlAddChild(nc,nc1);
848  }
849
850  nc1 = xmlNewNode(NULL, BAD_CAST "DataInputs");
[9]851  elements* e=serv->inputs;
[76]852  printFullDescription(e,"Input",ns_ows,nc1);
853  xmlAddChild(nc,nc1);
[1]854
[76]855  nc1 = xmlNewNode(NULL, BAD_CAST "ProcessOutputs");
856  e=serv->outputs;
857  printFullDescription(e,"Output",ns_ows,nc1);
858  xmlAddChild(nc,nc1);
[1]859
[76]860  xmlAddChild(n,nc);
[1]861
[76]862}
[1]863
[114]864void printFullDescription(elements *elem,const char* type,xmlNsPtr ns_ows,xmlNodePtr nc1){
[76]865  char *orderedFields[7];
866  orderedFields[0]="mimeType";
867  orderedFields[1]="encoding";
868  orderedFields[2]="schema";
869  orderedFields[3]="dataType";
870  orderedFields[4]="uom";
871  orderedFields[5]="CRS";
872  orderedFields[6]="value";
873
874  xmlNodePtr nc2,nc3,nc4,nc5,nc6,nc7;
875  elements* e=elem;
876  map* tmp1=NULL;
[1]877  while(e!=NULL){
[76]878    int default1=0;
879    int isAnyValue=1;
880    nc2 = xmlNewNode(NULL, BAD_CAST type);
[1]881    tmp1=getMap(e->content,"minOccurs");
882    if(tmp1){
883      xmlNewProp(nc2,BAD_CAST tmp1->name,BAD_CAST tmp1->value);
884    }
885    tmp1=getMap(e->content,"maxOccurs");
886    if(tmp1){
887      xmlNewProp(nc2,BAD_CAST tmp1->name,BAD_CAST tmp1->value);
888    }
889
890    printDescription(nc2,ns_ows,e->name,e->content);
891
[76]892    if(strncmp(type,"Output",6)==0){
893      if(strncasecmp(e->format,"LITERALDATA",strlen(e->format))==0)
894        nc3 = xmlNewNode(NULL, BAD_CAST "LiteralOutput");
895      else if(strncasecmp(e->format,"COMPLEXDATA",strlen(e->format))==0)
[1]896        nc3 = xmlNewNode(NULL, BAD_CAST "ComplexOutput");
[76]897      else if(strncasecmp(e->format,"BOUNDINGBOXDATA",strlen(e->format))==0)
898        nc3 = xmlNewNode(NULL, BAD_CAST "BoundingBoxOutput");
[1]899      else
900        nc3 = xmlNewNode(NULL, BAD_CAST e->format);
[76]901    }else{
[79]902      if(strncasecmp(e->format,"LITERALDATA",strlen(e->format))==0){
[76]903        nc3 = xmlNewNode(NULL, BAD_CAST "LiteralData");
[79]904      }
[76]905      else if(strncasecmp(e->format,"COMPLEXDATA",strlen(e->format))==0)
906        nc3 = xmlNewNode(NULL, BAD_CAST "ComplexData");
907      else if(strncasecmp(e->format,"BOUNDINGBOXDATA",strlen(e->format))==0)
908        nc3 = xmlNewNode(NULL, BAD_CAST "BoundingBoxData");
909      else
910        nc3 = xmlNewNode(NULL, BAD_CAST e->format);
911    }
[1]912    iotype* _tmp=e->defaults;
913    int datatype=0;
[79]914    bool hasDefault=false;
915    bool hasUOM=false;
[1]916    if(_tmp!=NULL){
[79]917      if(strcmp(e->format,"LiteralOutput")==0 ||
918         strcmp(e->format,"LiteralData")==0){
[1]919        datatype=1;
920        nc4 = xmlNewNode(NULL, BAD_CAST "UOMs");
921        nc5 = xmlNewNode(NULL, BAD_CAST "Default");
[79]922      }
923      else if(strcmp(e->format,"BoundingBoxOutput")==0 ||
924              strcmp(e->format,"BoundingBoxData")==0){
925        datatype=2;
926        //nc4 = xmlNewNode(NULL, BAD_CAST "BoundingBoxOutput");
927        nc5 = xmlNewNode(NULL, BAD_CAST "Default");
928      }
929      else{
930        nc4 = xmlNewNode(NULL, BAD_CAST "Default");
931        nc5 = xmlNewNode(NULL, BAD_CAST "Format");
932      }
933     
934      tmp1=_tmp->content;
935      int avcnt=0;
936      int dcnt=0;
937      int oI=0;
938      for(oI=0;oI<7;oI++)
939        if((tmp1=getMap(_tmp->content,orderedFields[oI]))!=NULL){
940          //while(tmp1!=NULL){
[1]941#ifdef DEBUG
[79]942          printf("DATATYPE DEFAULT ? %s\n",tmp1->name);
[1]943#endif
[79]944          if(strncasecmp(tmp1->name,"DataType",8)==0){
945            nc6 = xmlNewNode(ns_ows, BAD_CAST "DataType");
946            xmlAddChild(nc6,xmlNewText(BAD_CAST tmp1->value));
947            char tmp[1024];
948            sprintf(tmp,"http://www.w3.org/TR/xmlschema-2/#%s",tmp1->value);
949            xmlNewNsProp(nc6,ns_ows,BAD_CAST "reference",BAD_CAST tmp);
950            xmlAddChild(nc3,nc6);
951            tmp1=tmp1->next;
952            datatype=1;
953            continue;
954          }
955          if(strcmp(tmp1->name,"asReference")!=0 &&
956             strncasecmp(tmp1->name,"DataType",8)!=0 &&
957             strcasecmp(tmp1->name,"extension")!=0 &&
958             strcasecmp(tmp1->name,"value")!=0 &&
959             strncasecmp(tmp1->name,"AllowedValues",13)!=0){
960            if(datatype!=1){
961              char *tmp2=zCapitalize1(tmp1->name);
962              nc6 = xmlNewNode(NULL, BAD_CAST tmp2);
963              free(tmp2);
964            }
965            else{
966              char *tmp2=zCapitalize(tmp1->name);
967              nc6 = xmlNewNode(ns_ows, BAD_CAST tmp2);
968              free(tmp2);
969            }
970            xmlAddChild(nc6,xmlNewText(BAD_CAST tmp1->value));
971            xmlAddChild(nc5,nc6);
972            hasUOM=true;
973          }else 
974            if(strncmp(type,"Input",5)==0){
975              if(strcmp(tmp1->name,"value")==0){
976                nc7 = xmlNewNode(NULL, BAD_CAST "DefaultValue");
977                xmlAddChild(nc7,xmlNewText(BAD_CAST tmp1->value));
978                default1=1;
979              }
980              if(strncasecmp(tmp1->name,"AllowedValues",13)==0){
981                nc6 = xmlNewNode(ns_ows, BAD_CAST "AllowedValues");
982                fprintf(stderr,"ALLOWED VALUE %s\n",tmp1->value);
983                char *token,*saveptr1;
984                token=strtok_r(tmp1->value,",",&saveptr1);
985                while(token!=NULL){
986                  nc7 = xmlNewNode(ns_ows, BAD_CAST "Value");
987                  char *tmps=strdup(token);
988                  tmps[strlen(tmps)]=0;
989                  xmlAddChild(nc7,xmlNewText(BAD_CAST tmps));
990                  fprintf(stderr,"strgin : %s\n",tmps);
991                  xmlAddChild(nc6,nc7);
992                  token=strtok_r(NULL,",",&saveptr1);
993                }
994                xmlAddChild(nc3,nc6);
995                isAnyValue=-1;
996              }
997              hasDefault=true;
998            }
999          tmp1=tmp1->next;
1000          if(datatype!=2){
1001            if(hasUOM==true){
1002              xmlAddChild(nc4,nc5);
1003              xmlAddChild(nc3,nc4);
1004            }
1005          }else{
1006            xmlAddChild(nc3,nc5);
1007          }
[76]1008         
[79]1009          if(strncmp(type,"Input",5)==0){
1010            if(datatype==1 && isAnyValue==1 && avcnt==0){
1011              xmlAddChild(nc3,xmlNewNode(ns_ows, BAD_CAST "AnyValue"));
1012              hasDefault=true;
1013              avcnt++;
1014            }
1015            if(datatype==1 && default1>0){
1016              xmlAddChild(nc3,nc7);
1017            }
1018          }
[1]1019        }
1020    }
[280]1021
[1]1022    _tmp=e->supported;
[289]1023    if(_tmp==NULL && (getMap(e->defaults->content,"uom")!=NULL || datatype!=1))
[280]1024      _tmp=e->defaults;
1025
[71]1026    int hasSupported=-1;
[1]1027    while(_tmp!=NULL){
[71]1028      if(hasSupported<0){
1029        if(datatype==0){
1030          nc4 = xmlNewNode(NULL, BAD_CAST "Supported");
1031          nc5 = xmlNewNode(NULL, BAD_CAST "Format");
1032        }
1033        else
1034          nc5 = xmlNewNode(NULL, BAD_CAST "Supported");
1035        hasSupported=0;
1036      }else
[76]1037        if(datatype==0)
1038          nc5 = xmlNewNode(NULL, BAD_CAST "Format");
[1]1039      tmp1=_tmp->content;
[71]1040      int oI=0;
[76]1041      for(oI=0;oI<6;oI++)
[71]1042        if((tmp1=getMap(_tmp->content,orderedFields[oI]))!=NULL){
[1]1043#ifdef DEBUG
[71]1044          printf("DATATYPE SUPPORTED ? %s\n",tmp1->name);
[1]1045#endif
[71]1046          if(strcmp(tmp1->name,"asReference")!=0 && 
1047             strcmp(tmp1->name,"DataType")!=0 &&
1048             strcasecmp(tmp1->name,"extension")!=0){
[76]1049            if(datatype!=1){
[71]1050              char *tmp2=zCapitalize1(tmp1->name);
1051              nc6 = xmlNewNode(NULL, BAD_CAST tmp2);
1052              free(tmp2);
1053            }
1054            else{
1055              char *tmp2=zCapitalize(tmp1->name);
1056              nc6 = xmlNewNode(ns_ows, BAD_CAST tmp2);
1057              free(tmp2);
1058            }
[76]1059            if(datatype==2){
1060              char *tmpv,*tmps;
1061              tmps=strtok_r(tmp1->value,",",&tmpv);
1062              while(tmps){
1063                xmlAddChild(nc6,xmlNewText(BAD_CAST tmps));
1064                xmlAddChild(nc5,nc6);
1065                tmps=strtok_r(NULL,",",&tmpv);
1066                if(tmps){
1067                  char *tmp2=zCapitalize1(tmp1->name);
1068                  nc6 = xmlNewNode(NULL, BAD_CAST tmp2);
1069                  free(tmp2);
1070                }
1071              }
1072            }
1073            else{
1074              xmlAddChild(nc6,xmlNewText(BAD_CAST tmp1->value));
1075              xmlAddChild(nc5,nc6);
1076            }
[9]1077          }
[71]1078          tmp1=tmp1->next;
[1]1079        }
[71]1080      if(hasSupported<=0){
[76]1081        if(datatype!=2){
[71]1082          xmlAddChild(nc4,nc5);
1083          xmlAddChild(nc3,nc4);
1084        }else
[76]1085          xmlAddChild(nc3,nc5);
[71]1086        hasSupported=1;
[1]1087      }
[71]1088      else
[76]1089        if(datatype!=2){
1090          xmlAddChild(nc4,nc5);
1091        }
1092        else
1093          xmlAddChild(nc3,nc5);
1094      _tmp=_tmp->next;
[1]1095    }
1096    xmlAddChild(nc2,nc3);
1097   
[79]1098    if(datatype!=2 && hasUOM==true){
[76]1099      xmlAddChild(nc3,nc4);
1100      xmlAddChild(nc2,nc3);
[79]1101    }else if(datatype!=2){
[84]1102      if(hasDefault!=true && strncmp(type,"Input",5)==0)
[79]1103        xmlAddChild(nc3,xmlNewNode(ns_ows, BAD_CAST "AnyValue"));
[76]1104    }
[1]1105   
1106    xmlAddChild(nc1,nc2);
1107   
1108    e=e->next;
1109  }
1110}
1111
[114]1112void printProcessResponse(maps* m,map* request, int pid,service* serv,const char* service,int status,maps* inputs,maps* outputs){
[280]1113  xmlNsPtr ns,ns1,ns_ows,ns_xlink,ns_xsi;
[9]1114  xmlNodePtr nr,n,nc,nc1,nc2,nc3,pseudor;
1115  xmlDocPtr doc;
[1]1116  xmlChar *xmlbuff;
1117  int buffersize;
[9]1118  time_t time1; 
1119  time(&time1);
[280]1120  nr=NULL;
[9]1121  /**
1122   * Create the document and its temporary root.
1123   */
1124  doc = xmlNewDoc(BAD_CAST "1.0");
1125  int wpsId=zooXmlAddNs(NULL,"http://www.opengis.net/wps/1.0.0","wps");
1126  ns=usedNs[wpsId];
[280]1127
[9]1128  n = xmlNewNode(ns, BAD_CAST "ExecuteResponse");
[280]1129  xmlNewNs(n,BAD_CAST "http://www.opengis.net/wps/1.0.0",BAD_CAST "wps");
[9]1130  int owsId=zooXmlAddNs(n,"http://www.opengis.net/ows/1.1","ows");
1131  ns_ows=usedNs[owsId];
1132  int xlinkId=zooXmlAddNs(n,"http://www.w3.org/1999/xlink","xlink");
1133  ns_xlink=usedNs[xlinkId];
1134  int xsiId=zooXmlAddNs(n,"http://www.w3.org/2001/XMLSchema-instance","xsi");
1135  ns_xsi=usedNs[xsiId];
[280]1136 
[9]1137  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");
1138 
1139  xmlNewProp(n,BAD_CAST "service",BAD_CAST "WPS");
1140  xmlNewProp(n,BAD_CAST "version",BAD_CAST "1.0.0");
[34]1141  addLangAttr(n,m);
1142
[9]1143  char tmp[256];
[26]1144  char url[1024];
[72]1145  char stored_path[1024];
[9]1146  memset(tmp,0,256);
[72]1147  memset(url,0,1024);
1148  memset(stored_path,0,1024);
[9]1149  maps* tmp_maps=getMaps(m,"main");
1150  if(tmp_maps!=NULL){
[26]1151    map* tmpm1=getMap(tmp_maps->content,"serverAddress");
1152    /**
1153     * Check if the ZOO Service GetStatus is available in the local directory.
1154     * If yes, then it uses a reference to an URL which the client can access
1155     * to get information on the status of a running Service (using the
1156     * percentCompleted attribute).
1157     * Else fallback to the initial method using the xml file to write in ...
1158     */
1159    char ntmp[1024];
1160#ifndef WIN32
1161    getcwd(ntmp,1024);
1162#else
1163    _getcwd(ntmp,1024);
1164#endif
1165    struct stat myFileInfo;
1166    int statRes;
1167    char file_path[1024];
1168    sprintf(file_path,"%s/GetStatus.zcfg",ntmp);
1169    statRes=stat(file_path,&myFileInfo);
1170    if(statRes==0){
1171      char currentSid[128];
1172      map* tmpm=getMap(tmp_maps->content,"rewriteUrl");
1173      map *tmp_lenv=NULL;
1174      tmp_lenv=getMapFromMaps(m,"lenv","sid");
1175      if(tmp_lenv==NULL)
1176        sprintf(currentSid,"%i",pid);
1177      else
1178        sprintf(currentSid,"%s",tmp_lenv->value);
1179      if(tmpm==NULL || strcasecmp(tmpm->value,"false")==0){
[280]1180        sprintf(url,"%s?request=Execute&service=WPS&version=1.0.0&Identifier=GetStatus&DataInputs=sid=%s&RawDataOutput=Result",tmpm1->value,currentSid);
[26]1181      }else{
1182        if(strlen(tmpm->value)>0)
1183          if(strcasecmp(tmpm->value,"true")!=0)
1184            sprintf(url,"%s/%s/GetStatus/%s",tmpm1->value,tmpm->value,currentSid);
1185          else
1186            sprintf(url,"%s/GetStatus/%s",tmpm1->value,currentSid);
1187        else
[41]1188          sprintf(url,"%s/?request=Execute&service=WPS&version=1.0.0&Identifier=GetStatus&DataInputs=sid=%s&RawDataOutput=Result",tmpm1->value,currentSid);
[26]1189      }
1190    }else{
1191      map* tmpm2=getMap(tmp_maps->content,"tmpUrl");
1192      if(tmpm1!=NULL && tmpm2!=NULL){
[378]1193        if(strncasecmp(tmpm2->value,"http://",7)==0){
1194          sprintf(url,"%s/%s_%i.xml",tmpm2->value,service,pid);
1195        }else
1196          sprintf(url,"%s/%s/%s_%i.xml",tmpm1->value,tmpm2->value,service,pid);
[26]1197      }
[9]1198    }
[26]1199    if(tmpm1!=NULL)
[280]1200      sprintf(tmp,"%s",tmpm1->value);
[72]1201    tmpm1=getMapFromMaps(m,"main","TmpPath");
1202    sprintf(stored_path,"%s/%s_%i.xml",tmpm1->value,service,pid);
[9]1203  }
1204
[72]1205
[364]1206
[9]1207  xmlNewProp(n,BAD_CAST "serviceInstance",BAD_CAST tmp);
[72]1208  map* test=getMap(request,"storeExecuteResponse");
1209  bool hasStoredExecuteResponse=false;
1210  if(test!=NULL && strcasecmp(test->value,"true")==0){
[9]1211    xmlNewProp(n,BAD_CAST "statusLocation",BAD_CAST url);
[72]1212    hasStoredExecuteResponse=true;
[9]1213  }
1214
1215  nc = xmlNewNode(ns, BAD_CAST "Process");
1216  map* tmp2=getMap(serv->content,"processVersion");
1217
1218  if(tmp2!=NULL)
1219    xmlNewNsProp(nc,ns,BAD_CAST "processVersion",BAD_CAST tmp2->value);
1220 
1221  printDescription(nc,ns_ows,serv->name,serv->content);
[364]1222  //fflush(stderr);
[9]1223
1224  xmlAddChild(n,nc);
1225
1226  nc = xmlNewNode(ns, BAD_CAST "Status");
1227  const struct tm *tm;
1228  size_t len;
1229  time_t now;
1230  char *tmp1;
[26]1231  map *tmpStatus;
[9]1232 
1233  now = time ( NULL );
1234  tm = localtime ( &now );
1235
1236  tmp1 = (char*)malloc((TIME_SIZE+1)*sizeof(char));
1237
1238  len = strftime ( tmp1, TIME_SIZE, "%Y-%m-%dT%I:%M:%SZ", tm );
1239
[26]1240  xmlNewProp(nc,BAD_CAST "creationTime",BAD_CAST tmp1);
1241
1242  char sMsg[2048];
[9]1243  switch(status){
1244  case SERVICE_SUCCEEDED:
1245    nc1 = xmlNewNode(ns, BAD_CAST "ProcessSucceeded");
[34]1246    sprintf(sMsg,_("Service \"%s\" run successfully."),serv->name);
[26]1247    nc3=xmlNewText(BAD_CAST sMsg);
1248    xmlAddChild(nc1,nc3);
[9]1249    break;
1250  case SERVICE_STARTED:
1251    nc1 = xmlNewNode(ns, BAD_CAST "ProcessStarted");
[26]1252    tmpStatus=getMapFromMaps(m,"lenv","status");
1253    xmlNewProp(nc1,BAD_CAST "percentCompleted",BAD_CAST tmpStatus->value);
[34]1254    sprintf(sMsg,_("ZOO Service \"%s\" is currently running. Please, reload this document to get the up-to-date status of the Service."),serv->name);
[26]1255    nc3=xmlNewText(BAD_CAST sMsg);
1256    xmlAddChild(nc1,nc3);
[9]1257    break;
1258  case SERVICE_ACCEPTED:
1259    nc1 = xmlNewNode(ns, BAD_CAST "ProcessAccepted");
[34]1260    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);
[26]1261    nc3=xmlNewText(BAD_CAST sMsg);
1262    xmlAddChild(nc1,nc3);
[9]1263    break;
1264  case SERVICE_FAILED:
1265    nc1 = xmlNewNode(ns, BAD_CAST "ProcessFailed");
[26]1266    map *errorMap;
1267    map *te;
1268    te=getMapFromMaps(m,"lenv","code");
1269    if(te!=NULL)
1270      errorMap=createMap("code",te->value);
1271    else
1272      errorMap=createMap("code","NoApplicableCode");
1273    te=getMapFromMaps(m,"lenv","message");
1274    if(te!=NULL)
[57]1275      addToMap(errorMap,"text",_ss(te->value));
[26]1276    else
[34]1277      addToMap(errorMap,"text",_("No more information available"));
[26]1278    nc3=createExceptionReportNode(m,errorMap,0);
[59]1279    freeMap(&errorMap);
1280    free(errorMap);
[26]1281    xmlAddChild(nc1,nc3);
[9]1282    break;
1283  default :
[34]1284    printf(_("error code not know : %i\n"),status);
[26]1285    //exit(1);
[9]1286    break;
1287  }
1288  xmlAddChild(nc,nc1);
1289  xmlAddChild(n,nc);
1290  free(tmp1);
1291
1292#ifdef DEBUG
1293  fprintf(stderr,"printProcessResponse 1 161\n");
1294#endif
1295
1296  map* lineage=getMap(request,"lineage");
[87]1297  if(lineage!=NULL && strcasecmp(lineage->value,"true")==0){
[9]1298    nc = xmlNewNode(ns, BAD_CAST "DataInputs");
1299    int i;
1300    maps* mcursor=inputs;
[65]1301    elements* scursor=NULL;
[9]1302    while(mcursor!=NULL /*&& scursor!=NULL*/){
[65]1303      scursor=getElements(serv->inputs,mcursor->name);
[76]1304      printIOType(doc,nc,ns,ns_ows,ns_xlink,scursor,mcursor,"Input");
[9]1305      mcursor=mcursor->next;
1306    }
1307    xmlAddChild(n,nc);
1308   
1309#ifdef DEBUG
1310    fprintf(stderr,"printProcessResponse 1 177\n");
1311#endif
1312
1313    nc = xmlNewNode(ns, BAD_CAST "OutputDefinitions");
1314    mcursor=outputs;
[65]1315    scursor=NULL;
1316    while(mcursor!=NULL){
1317      scursor=getElements(serv->outputs,mcursor->name);
[9]1318      printOutputDefinitions1(doc,nc,ns,ns_ows,scursor,mcursor,"Output");
1319      mcursor=mcursor->next;
1320    }
1321    xmlAddChild(n,nc);
1322  }
1323#ifdef DEBUG
1324  fprintf(stderr,"printProcessResponse 1 190\n");
1325#endif
1326
1327  /**
1328   * Display the process output only when requested !
1329   */
1330  if(status==SERVICE_SUCCEEDED){
1331    nc = xmlNewNode(ns, BAD_CAST "ProcessOutputs");
1332    maps* mcursor=outputs;
1333    elements* scursor=serv->outputs;
[379]1334    map* testResponse=getMap(request,"RawDataOutput");
1335    if(testResponse==NULL)
1336      testResponse=getMap(request,"ResponseDocument");
[63]1337    while(mcursor!=NULL){
[379]1338      map* tmp0=getMap(mcursor->content,"inRequest");
[65]1339      scursor=getElements(serv->outputs,mcursor->name);
[280]1340      if(scursor!=NULL){
[379]1341        if(testResponse==NULL)
1342          printIOType(doc,nc,ns,ns_ows,ns_xlink,scursor,mcursor,"Output");
1343        else
1344          if(strncmp(tmp0->value,"true",4)==0)
1345            printIOType(doc,nc,ns,ns_ows,ns_xlink,scursor,mcursor,"Output");
[280]1346      }
[9]1347      mcursor=mcursor->next;
1348    }
1349    xmlAddChild(n,nc);
1350  }
[364]1351
[9]1352#ifdef DEBUG
1353  fprintf(stderr,"printProcessResponse 1 202\n");
1354#endif
[280]1355  nr=soapEnvelope(m,n);
1356  xmlDocSetRootElement(doc, nr);
1357
[76]1358  if(hasStoredExecuteResponse==true){
[72]1359    /* We need to write the ExecuteResponse Document somewhere */
1360    FILE* output=fopen(stored_path,"w");
[393]1361    if(output==NULL){
1362      /* If the file cannot be created return an ExceptionReport */
1363      char tmpMsg[1024];
1364      sprintf(tmpMsg,_("Unable to create the file : \"%s\" for storing the ExecuteResponse."),stored_path);
1365      map * errormap = createMap("text",tmpMsg);
1366      addToMap(errormap,"code", "InternalError");
1367      printExceptionReportResponse(m,errormap);
1368      freeMap(&errormap);
1369      free(errormap);
1370      xmlCleanupParser();
1371      zooXmlCleanupNs();
1372      return;
1373    }
[72]1374    xmlChar *xmlbuff;
1375    int buffersize;
1376    xmlDocDumpFormatMemoryEnc(doc, &xmlbuff, &buffersize, "UTF-8", 1);
[216]1377    fwrite(xmlbuff,1,xmlStrlen(xmlbuff)*sizeof(char),output);
[72]1378    xmlFree(xmlbuff);
1379    fclose(output);
1380  }
[9]1381  printDocument(m,doc,pid);
1382
1383  xmlCleanupParser();
1384  zooXmlCleanupNs();
1385}
1386
1387
1388void printDocument(maps* m, xmlDocPtr doc,int pid){
1389  char *encoding=getEncoding(m);
1390  if(pid==getpid()){
[384]1391    printHeaders(m);
[9]1392    printf("Content-Type: text/xml; charset=%s\r\nStatus: 200 OK\r\n\r\n",encoding);
1393  }
1394  fflush(stdout);
1395  xmlChar *xmlbuff;
1396  int buffersize;
[1]1397  /*
[9]1398   * Dump the document to a buffer and print it on stdout
[1]1399   * for demonstration purposes.
1400   */
[9]1401  xmlDocDumpFormatMemoryEnc(doc, &xmlbuff, &buffersize, encoding, 1);
[114]1402  printf("%s",xmlbuff);
[216]1403  fflush(stdout);
[1]1404  /*
1405   * Free associated memory.
1406   */
1407  xmlFree(xmlbuff);
[9]1408  xmlFreeDoc(doc);
1409  xmlCleanupParser();
1410  zooXmlCleanupNs();
[1]1411}
1412
[114]1413void printOutputDefinitions1(xmlDocPtr doc,xmlNodePtr nc,xmlNsPtr ns_wps,xmlNsPtr ns_ows,elements* e,maps* m,const char* type){
[1]1414  xmlNodePtr nc1;
1415  nc1=xmlNewNode(ns_wps, BAD_CAST type);
1416  map *tmp=NULL; 
1417  if(e!=NULL && e->defaults!=NULL)
1418    tmp=e->defaults->content;
1419  else{
1420    /*
1421    dumpElements(e);
1422    */
1423    return;
1424  }
1425  while(tmp!=NULL){
[9]1426    if(strncasecmp(tmp->name,"MIMETYPE",strlen(tmp->name))==0
1427       || strncasecmp(tmp->name,"ENCODING",strlen(tmp->name))==0
1428       || strncasecmp(tmp->name,"SCHEMA",strlen(tmp->name))==0
1429       || strncasecmp(tmp->name,"UOM",strlen(tmp->name))==0)
[1]1430    xmlNewProp(nc1,BAD_CAST tmp->name,BAD_CAST tmp->value);
1431    tmp=tmp->next;
1432  }
1433  tmp=getMap(e->defaults->content,"asReference");
1434  if(tmp==NULL)
1435    xmlNewProp(nc1,BAD_CAST "asReference",BAD_CAST "false");
1436
1437  tmp=e->content;
1438
1439  printDescription(nc1,ns_ows,m->name,e->content);
1440
1441  xmlAddChild(nc,nc1);
1442
1443}
1444
[114]1445void printOutputDefinitions(xmlDocPtr doc,xmlNodePtr nc,xmlNsPtr ns_wps,xmlNsPtr ns_ows,elements* e,map* m,const char* type){
[1]1446  xmlNodePtr nc1,nc2,nc3;
1447  nc1=xmlNewNode(ns_wps, BAD_CAST type);
1448  map *tmp=NULL; 
1449  if(e!=NULL && e->defaults!=NULL)
1450    tmp=e->defaults->content;
1451  else{
1452    /*
1453    dumpElements(e);
1454    */
1455    return;
1456  }
1457  while(tmp!=NULL){
1458    xmlNewProp(nc1,BAD_CAST tmp->name,BAD_CAST tmp->value);
1459    tmp=tmp->next;
1460  }
1461  tmp=getMap(e->defaults->content,"asReference");
1462  if(tmp==NULL)
1463    xmlNewProp(nc1,BAD_CAST "asReference",BAD_CAST "false");
1464
1465  tmp=e->content;
1466
1467  printDescription(nc1,ns_ows,m->name,e->content);
1468
1469  xmlAddChild(nc,nc1);
1470
1471}
1472
[114]1473void printIOType(xmlDocPtr doc,xmlNodePtr nc,xmlNsPtr ns_wps,xmlNsPtr ns_ows,xmlNsPtr ns_xlink,elements* e,maps* m,const char* type){
[1]1474  xmlNodePtr nc1,nc2,nc3;
1475  nc1=xmlNewNode(ns_wps, BAD_CAST type);
[65]1476  map *tmp=NULL;
1477  if(e!=NULL)
1478    tmp=e->content;
1479  else
1480    tmp=m->content;
[26]1481#ifdef DEBUG
[1]1482  dumpMap(tmp);
1483  dumpElements(e);
[26]1484#endif
[1]1485  nc2=xmlNewNode(ns_ows, BAD_CAST "Identifier");
[65]1486  if(e!=NULL)
1487    nc3=xmlNewText(BAD_CAST e->name);
1488  else
1489    nc3=xmlNewText(BAD_CAST m->name);
[9]1490  xmlAddChild(nc2,nc3);
[1]1491  xmlAddChild(nc1,nc2);
1492  xmlAddChild(nc,nc1);
[9]1493  // Extract Title required to be first element in the ZCFG file !
[364]1494  bool isTitle=TRUE;
[65]1495  if(e!=NULL)
1496    tmp=getMap(e->content,"Title");
1497  else
1498    tmp=getMap(m->content,"Title");
1499 
1500  if(tmp!=NULL){
[43]1501    nc2=xmlNewNode(ns_ows, BAD_CAST tmp->name);
1502    nc3=xmlNewText(BAD_CAST _ss(tmp->value));
1503    xmlAddChild(nc2,nc3); 
1504    xmlAddChild(nc1,nc2);
[65]1505  }
1506
1507  if(e!=NULL)
1508    tmp=getMap(e->content,"Abstract");
1509  else
1510    tmp=getMap(m->content,"Abstract");
1511  if(tmp!=NULL){
1512    nc2=xmlNewNode(ns_ows, BAD_CAST tmp->name);
1513    nc3=xmlNewText(BAD_CAST _ss(tmp->value));
1514    xmlAddChild(nc2,nc3); 
1515    xmlAddChild(nc1,nc2);
[43]1516    xmlAddChild(nc,nc1);
1517  }
[1]1518
1519  /**
1520   * IO type Reference or full Data ?
1521   */
[26]1522#ifdef DEBUG
[9]1523  fprintf(stderr,"FORMAT %s %s\n",e->format,e->format);
[26]1524#endif
[9]1525  map *tmpMap=getMap(m->content,"Reference");
1526  if(tmpMap==NULL){
1527    nc2=xmlNewNode(ns_wps, BAD_CAST "Data");
[65]1528    if(e!=NULL){
[76]1529      if(strncasecmp(e->format,"LiteralOutput",strlen(e->format))==0)
[65]1530        nc3=xmlNewNode(ns_wps, BAD_CAST "LiteralData");
[9]1531      else
[76]1532        if(strncasecmp(e->format,"ComplexOutput",strlen(e->format))==0)
[65]1533          nc3=xmlNewNode(ns_wps, BAD_CAST "ComplexData");
[76]1534        else if(strncasecmp(e->format,"BoundingBoxOutput",strlen(e->format))==0)
1535          nc3=xmlNewNode(ns_wps, BAD_CAST "BoundingBoxData");
[65]1536        else
1537          nc3=xmlNewNode(ns_wps, BAD_CAST e->format);
1538    }
1539    else{
1540      map* tmpV=getMapFromMaps(m,"format","value");
1541      if(tmpV!=NULL)
1542        nc3=xmlNewNode(ns_wps, BAD_CAST tmpV->value);
1543      else
1544        nc3=xmlNewNode(ns_wps, BAD_CAST "LitteralData");
[76]1545    } 
[9]1546    tmp=m->content;
[297]1547#ifdef USE_MS
1548    map* testMap=getMap(tmp,"requestedMimeType");
1549#endif
[9]1550    while(tmp!=NULL){
[70]1551      if(strcasecmp(tmp->name,"mimeType")==0 ||
1552         strcasecmp(tmp->name,"encoding")==0 ||
1553         strcasecmp(tmp->name,"schema")==0 ||
1554         strcasecmp(tmp->name,"datatype")==0 ||
1555         strcasecmp(tmp->name,"uom")==0)
[297]1556#ifdef USE_MS
[299]1557        if(testMap==NULL || (testMap!=NULL && strncasecmp(testMap->value,"text/xml",8)==0)){
[297]1558#endif
[9]1559        xmlNewProp(nc3,BAD_CAST tmp->name,BAD_CAST tmp->value);
[297]1560#ifdef USE_MS
[299]1561        }
1562      else
1563        if(strcasecmp(tmp->name,"mimeType")==0)
1564          if(testMap!=NULL)
1565            xmlNewProp(nc3,BAD_CAST tmp->name,BAD_CAST testMap->value);
1566          else 
1567            xmlNewProp(nc3,BAD_CAST tmp->name,BAD_CAST tmp->value);
[297]1568#endif
[9]1569      tmp=tmp->next;
1570      xmlAddChild(nc2,nc3);
[1]1571    }
[76]1572    if(e!=NULL && e->format!=NULL && strcasecmp(e->format,"BoundingBoxData")==0){
1573      map* bb=getMap(m->content,"value");
1574      if(bb!=NULL){
1575        map* tmpRes=parseBoundingBox(bb->value);
1576        printBoundingBox(ns_ows,nc3,tmpRes);
1577        freeMap(&tmpRes);
1578        free(tmpRes);
[9]1579      }
[76]1580    }else{
1581      if(e!=NULL)
1582        tmp=getMap(e->defaults->content,"mimeType");
1583      else
1584        tmp=NULL;
[297]1585#ifdef USE_MS
1586      /**
1587       * In case of OGC WebServices output use, as the data was requested
1588       * with asReference=false we have to download the resulting OWS request
1589       * stored in the Reference map value.
1590       */
1591      map* testMap=getMap(m->content,"requestedMimeType");
1592      if(testMap!=NULL){
1593        HINTERNET hInternet;
1594        hInternet=InternetOpen(
1595#ifndef WIN32
1596                               (LPCTSTR)
1597#endif
1598                               "ZooWPSClient\0",
1599                               INTERNET_OPEN_TYPE_PRECONFIG,
1600                               NULL,NULL, 0);
1601        testMap=getMap(m->content,"Reference");
1602        loadRemoteFile(m,m->content,hInternet,testMap->value);
1603        InternetCloseHandle(hInternet);
1604      }
1605#endif
[76]1606      map* tmp1=getMap(m->content,"encoding");
1607      map* tmp2=getMap(m->content,"mimeType");
[379]1608      map* tmp3=getMap(m->content,"value");
1609      int hasValue=1;
1610      if(tmp3==NULL){
1611        tmp3=createMap("value","");
1612        hasValue=-1;
1613      }
[76]1614      if((tmp1!=NULL && strncmp(tmp1->value,"base64",6)==0)
1615         || (tmp2!=NULL && (strncmp(tmp2->value,"image/",6)==0 ||
1616                            (strncmp(tmp2->value,"application/",12)==0) &&
[279]1617                            strncmp(tmp2->value,"application/json",16)!=0&&
1618                            strncmp(tmp2->value,"application/vnd.google-earth.kml",32)!=0)
1619             )) {
[76]1620        map* rs=getMap(m->content,"size");
1621        bool isSized=true;
1622        if(rs==NULL){
1623          char tmp1[1024];
[379]1624          sprintf(tmp1,"%d",strlen(tmp3->value));
[280]1625          rs=createMap("size",tmp1);
[76]1626          isSized=false;
1627        }
[94]1628
[379]1629        xmlAddChild(nc3,xmlNewText(BAD_CAST base64(tmp3->value, atoi(rs->value))));
[76]1630        if(!isSized){
1631          freeMap(&rs);
1632          free(rs);
1633        }
[59]1634      }
[280]1635      else if(tmp2!=NULL){
1636        if(strncmp(tmp2->value,"text/js",7)==0 ||
1637           strncmp(tmp2->value,"application/json",16)==0)
[379]1638          xmlAddChild(nc3,xmlNewCDataBlock(doc,BAD_CAST tmp3->value,strlen(tmp3->value)));
[280]1639        else{
1640          if(strncmp(tmp2->value,"text/xml",8)==0 ||
[307]1641             strncmp(tmp2->value,"application/vnd.google-earth.kml",32)==0){
[280]1642            xmlDocPtr doc =
[379]1643              xmlParseMemory(tmp3->value,strlen(tmp3->value));
[280]1644            xmlNodePtr ir = xmlDocGetRootElement(doc);
1645            xmlAddChild(nc3,ir);
1646          }
1647          else
[379]1648            xmlAddChild(nc3,xmlNewText(BAD_CAST tmp3->value));
[280]1649        }
[76]1650        xmlAddChild(nc2,nc3);
1651      }
[364]1652      else{
[379]1653        xmlAddChild(nc3,xmlNewText(BAD_CAST tmp3->value));
1654      }
1655      if(hasValue<0){
1656        freeMap(&tmp3);
1657        free(tmp3);
1658      }
[9]1659    }
[1]1660  }
[9]1661  else{
[297]1662    tmpMap=getMap(m->content,"Reference");
[9]1663    nc3=nc2=xmlNewNode(ns_wps, BAD_CAST "Reference");
[76]1664    if(strcasecmp(type,"Output")==0)
1665      xmlNewProp(nc3,BAD_CAST "href",BAD_CAST tmpMap->value);
1666    else
1667      xmlNewNsProp(nc3,ns_xlink,BAD_CAST "href",BAD_CAST tmpMap->value);
[9]1668    tmp=m->content;
[297]1669#ifdef USE_MS
1670    map* testMap=getMap(tmp,"requestedMimeType");
1671#endif
[9]1672    while(tmp!=NULL){
[70]1673      if(strcasecmp(tmp->name,"mimeType")==0 ||
1674         strcasecmp(tmp->name,"encoding")==0 ||
1675         strcasecmp(tmp->name,"schema")==0 ||
1676         strcasecmp(tmp->name,"datatype")==0 ||
1677         strcasecmp(tmp->name,"uom")==0)
[297]1678#ifdef USE_MS
1679        if(testMap!=NULL  && strncasecmp(testMap->value,"text/xml",8)!=0){
1680          if(strcasecmp(tmp->name,"mimeType")==0)
1681            xmlNewProp(nc3,BAD_CAST tmp->name,BAD_CAST testMap->value);
1682        }
1683        else
1684#endif
[9]1685        xmlNewProp(nc3,BAD_CAST tmp->name,BAD_CAST tmp->value);
1686      tmp=tmp->next;
1687      xmlAddChild(nc2,nc3);
1688    }
[1]1689  }
1690  xmlAddChild(nc1,nc2);
1691  xmlAddChild(nc,nc1);
1692
1693}
1694
[114]1695void printDescription(xmlNodePtr root,xmlNsPtr ns_ows,const char* identifier,map* amap){
[1]1696  xmlNodePtr nc2 = xmlNewNode(ns_ows, BAD_CAST "Identifier");
1697  xmlAddChild(nc2,xmlNewText(BAD_CAST identifier));
1698  xmlAddChild(root,nc2);
1699  map* tmp=amap;
1700  char *tmp2[2];
1701  tmp2[0]="Title";
1702  tmp2[1]="Abstract";
1703  int j=0;
1704  for(j=0;j<2;j++){
1705    map* tmp1=getMap(tmp,tmp2[j]);
1706    if(tmp1!=NULL){
1707      nc2 = xmlNewNode(ns_ows, BAD_CAST tmp2[j]);
[34]1708      xmlAddChild(nc2,xmlNewText(BAD_CAST _ss(tmp1->value)));
[1]1709      xmlAddChild(root,nc2);
1710    }
1711  }
1712}
1713
[9]1714char* getEncoding(maps* m){
1715  if(m!=NULL){
1716    map* tmp=getMap(m->content,"encoding");
[1]1717    if(tmp!=NULL){
[9]1718      return tmp->value;
[1]1719    }
1720    else
[9]1721      return "UTF-8";
[1]1722  }
1723  else
[9]1724    return "UTF-8"; 
1725}
[1]1726
[9]1727char* getVersion(maps* m){
1728  if(m!=NULL){
1729    map* tmp=getMap(m->content,"version");
[1]1730    if(tmp!=NULL){
[9]1731      return tmp->value;
[1]1732    }
1733    else
[9]1734      return "1.0.0";
[1]1735  }
1736  else
[9]1737    return "1.0.0";
1738}
[1]1739
[9]1740void printExceptionReportResponse(maps* m,map* s){
1741  int buffersize;
1742  xmlDocPtr doc;
1743  xmlChar *xmlbuff;
[34]1744  xmlNodePtr n;
[1]1745
[9]1746  doc = xmlNewDoc(BAD_CAST "1.0");
1747  maps* tmpMap=getMaps(m,"main");
1748  char *encoding=getEncoding(tmpMap);
[32]1749  if(m!=NULL){
1750    map *tmpSid=getMapFromMaps(m,"lenv","sid");
1751    if(tmpSid!=NULL){
[384]1752      if( getpid()==atoi(tmpSid->value) ){
1753        printHeaders(m);
[32]1754        printf("Content-Type: text/xml; charset=%s\r\nStatus: 200 OK\r\n\r\n",encoding);
[384]1755      }
[32]1756    }
[384]1757    else{
1758      printHeaders(m);
[32]1759      printf("Content-Type: text/xml; charset=%s\r\nStatus: 200 OK\r\n\r\n",encoding);
[384]1760    }
[385]1761  }else{
[26]1762    printf("Content-Type: text/xml; charset=%s\r\nStatus: 200 OK\r\n\r\n",encoding);
[385]1763  }
[34]1764  n=createExceptionReportNode(m,s,1);
[1]1765  xmlDocSetRootElement(doc, n);
[9]1766  xmlDocDumpFormatMemoryEnc(doc, &xmlbuff, &buffersize, encoding, 1);
1767  printf("%s",xmlbuff);
1768  fflush(stdout);
1769  xmlFreeDoc(doc);
[1]1770  xmlFree(xmlbuff);
[9]1771  xmlCleanupParser();
[57]1772  zooXmlCleanupNs();
[1]1773}
1774
[26]1775xmlNodePtr createExceptionReportNode(maps* m,map* s,int use_ns){
1776 
1777  int buffersize;
1778  xmlChar *xmlbuff;
1779  xmlNsPtr ns,ns_ows,ns_xlink,ns_xsi;
1780  xmlNodePtr n,nc,nc1,nc2;
[1]1781
[26]1782  maps* tmpMap=getMaps(m,"main");
1783
[216]1784  int nsid=zooXmlAddNs(NULL,"http://www.opengis.net/ows/1.1","ows");
[57]1785  ns=usedNs[nsid];
[26]1786  n = xmlNewNode(ns, BAD_CAST "ExceptionReport");
1787
1788  if(use_ns==1){
1789    ns_ows=xmlNewNs(n,BAD_CAST "http://www.opengis.net/ows/1.1",BAD_CAST "ows");
1790    int xsiId=zooXmlAddNs(n,"http://www.w3.org/2001/XMLSchema-instance","xsi");
1791    ns_xsi=usedNs[xsiId];
1792    int xlinkId=zooXmlAddNs(n,"http://www.w3.org/1999/xlink","xlink");
1793    ns_xlink=usedNs[xlinkId];
1794    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");
1795  }
[34]1796  addLangAttr(n,m);
[26]1797  xmlNewProp(n,BAD_CAST "version",BAD_CAST "1.1.0");
1798 
1799  nc = xmlNewNode(ns, BAD_CAST "Exception");
1800
1801  map* tmp=getMap(s,"code");
1802  if(tmp!=NULL)
1803    xmlNewProp(nc,BAD_CAST "exceptionCode",BAD_CAST tmp->value);
1804  else
1805    xmlNewProp(nc,BAD_CAST "exceptionCode",BAD_CAST "NoApplicableCode");
1806
1807  tmp=getMap(s,"text");
1808  nc1 = xmlNewNode(ns, BAD_CAST "ExceptionText");
1809  nc2=NULL;
1810  if(tmp!=NULL){
1811    xmlNodeSetContent(nc1, BAD_CAST tmp->value);
1812  }
1813  else{
[34]1814    xmlNodeSetContent(nc1, BAD_CAST _("No debug message available"));
[26]1815  }
1816  xmlAddChild(nc,nc1);
1817  xmlAddChild(n,nc);
1818  return n;
1819}
1820
1821
[1]1822void outputResponse(service* s,maps* request_inputs,maps* request_outputs,
1823                    map* request_inputs1,int cpid,maps* m,int res){
1824#ifdef DEBUG
1825  dumpMaps(request_inputs);
1826  dumpMaps(request_outputs);
1827  fprintf(stderr,"printProcessResponse\n");
1828#endif
1829  map* toto=getMap(request_inputs1,"RawDataOutput");
1830  int asRaw=0;
1831  if(toto!=NULL)
1832    asRaw=1;
[9]1833 
[379]1834  maps* tmpSess=getMaps(m,"senv");
1835  if(tmpSess!=NULL){
1836    map *_tmp=getMapFromMaps(m,"lenv","cookie");
1837    char* sessId;
1838    if(_tmp!=NULL){
1839      printf("Set-Cookie: %s\r\n",_tmp->value);
1840      printf("P3P: CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"\r\n");
1841      char session_file_path[100];
[92]1842      char *tmp1=strtok(_tmp->value,";");
1843      if(tmp1!=NULL)
[379]1844        sprintf(session_file_path,"%s",strstr(tmp1,"=")+1);
[92]1845      else
[379]1846        sprintf(session_file_path,"%s",strstr(_tmp->value,"=")+1);
1847      sessId=strdup(session_file_path);
1848    }else{
1849      maps* t=getMaps(m,"senv");
1850      map*p=t->content;
1851      while(p!=NULL){
1852        if(strstr(p->name,"ID")!=NULL){
1853          sessId=strdup(p->value);
1854          break;
1855        }
1856        p=p->next;
1857      }
[92]1858    }
[379]1859    char session_file_path[1024];
1860    map *tmpPath=getMapFromMaps(m,"main","sessPath");
1861    if(tmpPath==NULL)
1862      tmpPath=getMapFromMaps(m,"main","tmpPath");
1863    sprintf(session_file_path,"%s/sess_%s.cfg",tmpPath->value,sessId);
[387]1864    FILE* teste=fopen(session_file_path,"w");
1865    if(teste==NULL){
1866      char tmpMsg[1024];
1867      sprintf(tmpMsg,_("Unable to create the file : \"%s\" for storing the session maps."),session_file_path);
1868      map * errormap = createMap("text",tmpMsg);
1869      addToMap(errormap,"code", "InternalError");
1870      printExceptionReportResponse(m,errormap);
1871      freeMap(&errormap);
1872      free(errormap);
1873      return;
1874    }
1875    else{
1876      fclose(teste);
1877      dumpMapsToFile(tmpSess,session_file_path);
1878    }
[92]1879  }
[379]1880 
[1]1881  if(asRaw==0){
[9]1882#ifdef DEBUG
1883    fprintf(stderr,"REQUEST_OUTPUTS FINAL\n");
1884    dumpMaps(request_outputs);
1885#endif
[70]1886    maps* tmpI=request_outputs;
1887    while(tmpI!=NULL){
[297]1888#ifdef USE_MS
[364]1889      map* testMap=getMap(tmpI->content,"useMapserver");       
[297]1890#endif
[70]1891      toto=getMap(tmpI->content,"asReference");
[297]1892#ifdef USE_MS
1893      if(toto!=NULL && strcasecmp(toto->value,"true")==0 && testMap==NULL){
1894#else
[70]1895      if(toto!=NULL && strcasecmp(toto->value,"true")==0){
[297]1896#endif
[76]1897        elements* in=getElements(s->outputs,tmpI->name);
1898        char *format=NULL;
1899        if(in!=NULL){
1900          format=strdup(in->format);
1901        }else
1902          format=strdup("LiteralData");
1903        if(strcasecmp(format,"BoundingBoxData")==0){
1904          addToMap(tmpI->content,"extension","xml");
1905          addToMap(tmpI->content,"mimeType","text/xml");
1906          addToMap(tmpI->content,"encoding","UTF-8");
1907          addToMap(tmpI->content,"schema","http://schemas.opengis.net/ows/1.1.0/owsCommon.xsd");
1908        }
1909        map *ext=getMap(tmpI->content,"extension");
[70]1910        map *tmp1=getMapFromMaps(m,"main","tmpPath");
1911        char *file_name;
1912        bool hasExt=true;
[76]1913        if(ext==NULL){
[70]1914          // We can fallback to a default list of supported formats using
1915          // mimeType information if present here. Maybe we can add more formats
1916          // here.
[383]1917          // If mimeType was not found, we then set txt as the default extension
[70]1918          map* mtype=getMap(tmpI->content,"mimeType");
1919          if(mtype!=NULL){
1920            if(strcasecmp(mtype->value,"text/xml")==0)
[76]1921              ext=createMap("extension","xml");
[70]1922            else if(strcasecmp(mtype->value,"application/json")==0)
[76]1923              ext=createMap("extension","js");
[306]1924            else if(strncmp(mtype->value,"application/vnd.google-earth.kml",32)==0)
[279]1925              ext=createMap("extension","kml");
[306]1926            else if(strncmp(mtype->value,"image/",6)==0)
1927              ext=createMap("extension",strstr(mtype->value,"/")+1);
[70]1928            else
[76]1929              ext=createMap("extension","txt");
[70]1930          }
[57]1931          else
[76]1932            ext=createMap("extension","txt");
[70]1933          hasExt=false;
[57]1934        }
[76]1935        file_name=(char*)malloc((strlen(tmp1->value)+strlen(s->name)+strlen(ext->value)+strlen(tmpI->name)+13)*sizeof(char));
1936        sprintf(file_name,"%s/%s_%s_%i.%s",tmp1->value,s->name,tmpI->name,cpid+100000,ext->value);
[383]1937        FILE *ofile=fopen(file_name,"wb");
[386]1938        if(ofile==NULL){
1939          char tmpMsg[1024];
[387]1940          sprintf(tmpMsg,_("Unable to create the file : \"%s\" for storing the %s final result."),file_name,tmpI->name);
[386]1941          map * errormap = createMap("text",tmpMsg);
1942          addToMap(errormap,"code", "InternalError");
1943          printExceptionReportResponse(m,errormap);
1944          freeMap(&errormap);
1945          free(errormap);
1946          return;
1947        }
[70]1948        map *tmp2=getMapFromMaps(m,"main","tmpUrl");
1949        map *tmp3=getMapFromMaps(m,"main","serverAddress");
1950        char *file_url;
[378]1951        if(strncasecmp(tmp2->value,"http://",7)==0){
1952          file_url=(char*)malloc((strlen(tmp2->value)+strlen(s->name)+strlen(ext->value)+strlen(tmpI->name)+13)*sizeof(char));
1953          sprintf(file_url,"%s/%s_%s_%i.%s",tmp2->value,s->name,tmpI->name,cpid+100000,ext->value);
1954        }else{
1955          file_url=(char*)malloc((strlen(tmp3->value)+strlen(tmp2->value)+strlen(s->name)+strlen(ext->value)+strlen(tmpI->name)+13)*sizeof(char));
1956          sprintf(file_url,"%s/%s/%s_%s_%i.%s",tmp3->value,tmp2->value,s->name,tmpI->name,cpid+100000,ext->value);
1957        }
[70]1958        addToMap(tmpI->content,"Reference",file_url);
[387]1959        if(!hasExt){
[76]1960          freeMap(&ext);
1961          free(ext);
[70]1962        }
1963        toto=getMap(tmpI->content,"value");
[76]1964        if(strcasecmp(format,"BoundingBoxData")!=0){
1965          map* size=getMap(tmpI->content,"size");
1966          if(size!=NULL && toto!=NULL)
1967            fwrite(toto->value,1,atoi(size->value)*sizeof(char),ofile);
1968          else
1969            if(toto!=NULL && toto->value!=NULL)
1970              fwrite(toto->value,1,strlen(toto->value)*sizeof(char),ofile);
1971        }else{
1972          printBoundingBoxDocument(m,tmpI,ofile);
1973        }
1974        free(format);
[70]1975        fclose(ofile);
1976        free(file_name);
[76]1977        free(file_url); 
[52]1978      }
[297]1979#ifdef USE_MS
1980      else{
1981        if(testMap!=NULL){
1982          setReferenceUrl(m,tmpI);
1983        }
1984      }
1985#endif
[70]1986      tmpI=tmpI->next;
[9]1987    }
[1]1988    map *r_inputs=getMap(s->content,"serviceProvider");
1989#ifdef DEBUG
1990    fprintf(stderr,"SERVICE : %s\n",r_inputs->value);
1991    dumpMaps(m);
1992#endif
[9]1993    printProcessResponse(m,request_inputs1,cpid,
[26]1994                         s,r_inputs->value,res,
1995                         request_inputs,
1996                         request_outputs);
[1]1997  }
[26]1998  else
1999    if(res!=SERVICE_FAILED){
2000      /**
[66]2001       * We get the requested output or fallback to the first one if the
2002       * requested one is not present in the resulting outputs maps.
[26]2003       */
[66]2004      maps* tmpI=NULL;
2005      map* tmpIV=getMap(request_inputs1,"RawDataOutput");
2006      if(tmpIV!=NULL){
2007        tmpI=getMaps(request_outputs,tmpIV->value);
2008      }
2009      if(tmpI==NULL)
2010        tmpI=request_outputs;
[76]2011      elements* e=getElements(s->outputs,tmpI->name);
2012      if(e!=NULL && strcasecmp(e->format,"BoundingBoxData")==0){
2013        printBoundingBoxDocument(m,tmpI,NULL);
2014      }else{
2015        toto=getMap(tmpI->content,"value");
2016        if(toto==NULL){
2017          char tmpMsg[1024];
2018          sprintf(tmpMsg,_("Wrong RawDataOutput parameter, unable to fetch any result for the name your provided : \"%s\"."),tmpI->name);
2019          map * errormap = createMap("text",tmpMsg);
2020          addToMap(errormap,"code", "InvalidParameterValue");
2021          printExceptionReportResponse(m,errormap);
2022          freeMap(&errormap);
2023          free(errormap);
[114]2024          return;
[76]2025        }
[383]2026        map* fname=getMapFromMaps(tmpI,tmpI->name,"filename");
2027        if(fname!=NULL)
2028          printf("Content-Disposition: attachment; filename=\"%s\"\r\n",fname->value);
2029        map* rs=getMapFromMaps(tmpI,tmpI->name,"size");
2030        if(rs!=NULL)
2031          printf("Content-Length: %s\r\n",rs->value);
[384]2032        printHeaders(m);
[76]2033        char mime[1024];
2034        map* mi=getMap(tmpI->content,"mimeType");
[1]2035#ifdef DEBUG
[76]2036        fprintf(stderr,"SERVICE OUTPUTS\n");
2037        dumpMaps(request_outputs);
2038        fprintf(stderr,"SERVICE OUTPUTS\n");
[1]2039#endif
[76]2040        map* en=getMap(tmpI->content,"encoding");
2041        if(mi!=NULL && en!=NULL)
[26]2042          sprintf(mime,
[76]2043                  "Content-Type: %s; charset=%s\r\nStatus: 200 OK\r\n\r\n",
2044                  mi->value,en->value);
[26]2045        else
[76]2046          if(mi!=NULL)
2047            sprintf(mime,
2048                    "Content-Type: %s; charset=UTF-8\r\nStatus: 200 OK\r\n\r\n",
2049                    mi->value);
2050          else
2051            sprintf(mime,"Content-Type: text/plain; charset=utf-8\r\nStatus: 200 OK\r\n\r\n");
2052        printf("%s",mime);
[383]2053        if(rs!=NULL)
[385]2054          fwrite(toto->value,1,atoi(rs->value),stdout);
[76]2055        else
[385]2056          fwrite(toto->value,1,strlen(toto->value),stdout);
[1]2057#ifdef DEBUG
[76]2058        dumpMap(toto);
[1]2059#endif
[76]2060      }
[26]2061    }else{
2062      char tmp[1024];
2063      map * errormap;
2064      map *lenv;
2065      lenv=getMapFromMaps(m,"lenv","message");
2066      if(lenv!=NULL)
[34]2067        sprintf(tmp,_("Unable to run the Service. The message returned back by the Service was the following : %s"),lenv->value);
[26]2068      else
[34]2069        sprintf(tmp,_("Unable to run the Service. No more information was returned back by the Service."));
[26]2070      errormap = createMap("text",tmp);     
2071      addToMap(errormap,"code", "InternalError");
2072      printExceptionReportResponse(m,errormap);
2073      freeMap(&errormap);
2074      free(errormap);
2075    }
[1]2076}
2077
[216]2078char *base64(const char *input, int length)
[1]2079{
2080  BIO *bmem, *b64;
2081  BUF_MEM *bptr;
2082
2083  b64 = BIO_new(BIO_f_base64());
[94]2084  BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
[1]2085  bmem = BIO_new(BIO_s_mem());
2086  b64 = BIO_push(b64, bmem);
2087  BIO_write(b64, input, length);
2088  BIO_flush(b64);
2089  BIO_get_mem_ptr(b64, &bptr);
2090
[94]2091  char *buff = (char *)malloc((bptr->length)*sizeof(char));
[1]2092  memcpy(buff, bptr->data, bptr->length-1);
2093  buff[bptr->length-1] = 0;
2094
2095  BIO_free_all(b64);
2096
2097  return buff;
2098}
2099
[216]2100char *base64d(const char *input, int length,int* red)
[88]2101{
2102  BIO *b64, *bmem;
2103
2104  char *buffer = (char *)malloc(length);
[94]2105  if(buffer){
2106    memset(buffer, 0, length);
2107    b64 = BIO_new(BIO_f_base64());
2108    if(b64){
[216]2109      bmem = BIO_new_mem_buf((unsigned char*)input,length);
[94]2110      bmem = BIO_push(b64, bmem);
2111      *red=BIO_read(bmem, buffer, length);
2112      buffer[length-1]=0;
2113      BIO_free_all(bmem);
2114    }
2115  }
[88]2116  return buffer;
2117}
2118
2119void ensureDecodedBase64(maps **in){
2120  maps* cursor=*in;
2121  while(cursor!=NULL){
2122    map *tmp=getMap(cursor->content,"encoding");
2123    if(tmp!=NULL && strncasecmp(tmp->value,"base64",6)==0){
2124      tmp=getMap(cursor->content,"value");
2125      addToMap(cursor->content,"base64_value",tmp->value);
[94]2126      int size=0;
[88]2127      char *s=strdup(tmp->value);
2128      free(tmp->value);
2129      tmp->value=base64d(s,strlen(s),&size);
[94]2130      free(s);
[88]2131      char sizes[1024];
2132      sprintf(sizes,"%d",size);
2133      addToMap(cursor->content,"size",sizes);
2134    }
2135    cursor=cursor->next;
2136  }
2137}
2138
[63]2139char* addDefaultValues(maps** out,elements* in,maps* m,int type){
[1]2140  elements* tmpInputs=in;
2141  maps* out1=*out;
[280]2142  if(type==1){
2143    while(out1!=NULL){
2144      if(getElements(in,out1->name)==NULL)
2145        return out1->name;
2146      out1=out1->next;
2147    }
2148    out1=*out;
2149  }
[1]2150  while(tmpInputs!=NULL){
2151    maps *tmpMaps=getMaps(out1,tmpInputs->name);
2152    if(tmpMaps==NULL){
[9]2153      maps* tmpMaps2=(maps*)malloc(MAPS_SIZE);
[57]2154      tmpMaps2->name=strdup(tmpInputs->name);
[9]2155      tmpMaps2->content=NULL;
2156      tmpMaps2->next=NULL;
[63]2157     
2158      if(type==0){
2159        map* tmpMapMinO=getMap(tmpInputs->content,"minOccurs");
2160        if(tmpMapMinO!=NULL)
2161          if(atoi(tmpMapMinO->value)>=1){
2162            freeMaps(&tmpMaps2);
2163            free(tmpMaps2);
2164            return tmpInputs->name;
2165          }
2166          else{
2167            if(tmpMaps2->content==NULL)
2168              tmpMaps2->content=createMap("minOccurs",tmpMapMinO->value);
2169            else
2170              addToMap(tmpMaps2->content,"minOccurs",tmpMapMinO->value);
2171          }
2172        map* tmpMaxO=getMap(tmpInputs->content,"maxOccurs");
2173        if(tmpMaxO!=NULL)
2174          if(tmpMaps2->content==NULL)
2175            tmpMaps2->content=createMap("maxOccurs",tmpMaxO->value);
2176          else
2177            addToMap(tmpMaps2->content,"maxOccurs",tmpMaxO->value);
2178      }
2179
[1]2180      iotype* tmpIoType=tmpInputs->defaults;
[63]2181      if(tmpIoType!=NULL){
2182        map* tmpm=tmpIoType->content;
2183        while(tmpm!=NULL){
2184          if(tmpMaps2->content==NULL)
2185            tmpMaps2->content=createMap(tmpm->name,tmpm->value);
2186          else
2187            addToMap(tmpMaps2->content,tmpm->name,tmpm->value);
2188          tmpm=tmpm->next;
2189        }
[1]2190      }
[88]2191      addToMap(tmpMaps2->content,"inRequest","false");
[93]2192      if(type==0){
[57]2193        map *tmpMap=getMap(tmpMaps2->content,"value");
2194        if(tmpMap==NULL)
2195          addToMap(tmpMaps2->content,"value","NULL");
2196      }
[1]2197      if(out1==NULL){
[9]2198        *out=dupMaps(&tmpMaps2);
[63]2199        out1=*out;
[1]2200      }
2201      else
[9]2202        addMapsToMaps(&out1,tmpMaps2);
[63]2203      freeMap(&tmpMaps2->content);
2204      free(tmpMaps2->content);
2205      tmpMaps2->content=NULL;
[9]2206      freeMaps(&tmpMaps2);
2207      free(tmpMaps2);
2208      tmpMaps2=NULL;
[1]2209    }
2210    else{
[57]2211      iotype* tmpIoType=getIoTypeFromElement(tmpInputs,tmpInputs->name,
2212                                             tmpMaps->content);
[63]2213      if(type==0) {
[76]2214        /**
2215         * In case of an Input maps, then add the minOccurs and maxOccurs to the
2216         * content map.
2217         */
[63]2218        map* tmpMap1=getMap(tmpInputs->content,"minOccurs");
2219        if(tmpMap1!=NULL){
2220          if(tmpMaps->content==NULL)
2221            tmpMaps->content=createMap("minOccurs",tmpMap1->value);
2222          else
2223            addToMap(tmpMaps->content,"minOccurs",tmpMap1->value);
2224        }
2225        map* tmpMaxO=getMap(tmpInputs->content,"maxOccurs");
2226        if(tmpMaxO!=NULL){
2227          if(tmpMaps->content==NULL)
2228            tmpMaps->content=createMap("maxOccurs",tmpMap1->value);
2229          else
2230            addToMap(tmpMaps->content,"maxOccurs",tmpMap1->value);
2231        }
[76]2232        /**
2233         * Parsing BoundingBoxData, fill the following map and then add it to
2234         * the content map of the Input maps:
2235         * lowerCorner, upperCorner, srs and dimensions
2236         * cf. parseBoundingBox
2237         */
2238        if(strcasecmp(tmpInputs->format,"BoundingBoxData")==0){
2239          maps* tmpI=getMaps(*out,tmpInputs->name);
2240          if(tmpI!=NULL){
2241            map* tmpV=getMap(tmpI->content,"value");
2242            if(tmpV!=NULL){
2243              char *tmpVS=strdup(tmpV->value);
2244              map* tmp=parseBoundingBox(tmpVS);
2245              free(tmpVS);
2246              map* tmpC=tmp;
2247              while(tmpC!=NULL){
2248                addToMap(tmpMaps->content,tmpC->name,tmpC->value);
2249                tmpC=tmpC->next;
2250              }
2251              freeMap(&tmp);
2252              free(tmp);
2253            }
2254          }
2255        }
[63]2256      }
2257
[57]2258      if(tmpIoType!=NULL){
2259        map* tmpContent=tmpIoType->content;
2260        map* cval=NULL;
[360]2261        int hasPassed=-1;
[57]2262        while(tmpContent!=NULL){
2263          if((cval=getMap(tmpMaps->content,tmpContent->name))==NULL){
[9]2264#ifdef DEBUG
[57]2265            fprintf(stderr,"addDefaultValues %s => %s\n",tmpContent->name,tmpContent->value);
[9]2266#endif
[63]2267            if(tmpMaps->content==NULL)
2268              tmpMaps->content=createMap(tmpContent->name,tmpContent->value);
2269            else
2270              addToMap(tmpMaps->content,tmpContent->name,tmpContent->value);
[360]2271           
2272            if(hasPassed<0 && type==0 && getMap(tmpMaps->content,"isArray")!=NULL){
2273              map* length=getMap(tmpMaps->content,"length");
2274              int i;
2275              char *tcn=strdup(tmpContent->name);
2276              for(i=1;i<atoi(length->value);i++){
[364]2277#ifdef DEBUG
[360]2278                dumpMap(tmpMaps->content);
2279                fprintf(stderr,"addDefaultValues %s_%d => %s\n",tcn,i,tmpContent->value);
[364]2280#endif
2281                int len=strlen((char*) tcn);
2282                char *tmp1=(char *)malloc((len+10)*sizeof(char));
[360]2283                sprintf(tmp1,"%s_%d",tcn,i);
[364]2284#ifdef DEBUG
[360]2285                fprintf(stderr,"addDefaultValues %s => %s\n",tmp1,tmpContent->value);
[364]2286#endif
[360]2287                addToMap(tmpMaps->content,tmp1,tmpContent->value);
2288                free(tmp1);
2289                hasPassed=1;
2290              }
2291              free(tcn);
2292            }
[57]2293          }
2294          tmpContent=tmpContent->next;
[9]2295        }
[297]2296#ifdef USE_MS
2297        /**
2298         * check for useMapServer presence
2299         */
2300        map* tmpCheck=getMap(tmpIoType->content,"useMapServer");
2301        if(tmpCheck!=NULL){
2302          // Get the default value
2303          tmpIoType=getIoTypeFromElement(tmpInputs,tmpInputs->name,NULL);
2304          tmpCheck=getMap(tmpMaps->content,"mimeType");
2305          addToMap(tmpMaps->content,"requestedMimeType",tmpCheck->value);
2306          map* cursor=tmpIoType->content;
2307          while(cursor!=NULL){
2308            addToMap(tmpMaps->content,cursor->name,cursor->value);
2309            cursor=cursor->next;
2310          }
2311         
2312          cursor=tmpInputs->content;
2313          while(cursor!=NULL){
2314            if(strcasecmp(cursor->name,"Title")==0 ||
2315               strcasecmp(cursor->name,"Abstract")==0)
2316              addToMap(tmpMaps->content,cursor->name,cursor->value);
2317           cursor=cursor->next;
2318          }
2319        }
2320#endif
[1]2321      }
[92]2322      if(tmpMaps->content==NULL)
2323        tmpMaps->content=createMap("inRequest","true");
2324      else
2325        addToMap(tmpMaps->content,"inRequest","true");
[280]2326
[1]2327    }
2328    tmpInputs=tmpInputs->next;
2329  }
[9]2330  return "";
[1]2331}
[76]2332
2333/**
2334 * parseBoundingBox : parse a BoundingBox string
2335 *
2336 * OGC 06-121r3 : 10.2 Bounding box
2337 *
2338 * value is provided as : lowerCorner,upperCorner,crs,dimension
2339 * exemple : 189000,834000,285000,962000,urn:ogc:def:crs:OGC:1.3:CRS84
2340 *
2341 * Need to create a map to store boundingbox informations :
2342 *  - lowerCorner : double,double (minimum within this bounding box)
2343 *  - upperCorner : double,double (maximum within this bounding box)
2344 *  - crs : URI (Reference to definition of the CRS)
2345 *  - dimensions : int
2346 *
2347 * Note : support only 2D bounding box.
2348 */
[114]2349map* parseBoundingBox(const char* value){
[76]2350  map *res=NULL;
2351  if(value!=NULL){
2352    char *cv,*cvp;
[114]2353    cv=strtok_r((char*) value,",",&cvp);
[76]2354    int cnt=0;
2355    int icnt=0;
2356    char *currentValue=NULL;
2357    while(cv){
2358      if(cnt<2)
2359        if(currentValue!=NULL){
2360          char *finalValue=(char*)malloc((strlen(currentValue)+strlen(cv)+1)*sizeof(char));
2361          sprintf(finalValue,"%s%s",currentValue,cv);
2362          switch(cnt){
2363          case 0:
2364            res=createMap("lowerCorner",finalValue);
2365            break;
2366          case 1:
2367            addToMap(res,"upperCorner",finalValue);
2368            icnt=-1;
2369            break;
2370          }
2371          cnt++;
2372          free(currentValue);
2373          currentValue=NULL;
2374          free(finalValue);
2375        }
2376        else{
2377          currentValue=(char*)malloc((strlen(cv)+2)*sizeof(char));
2378          sprintf(currentValue,"%s ",cv);
2379        }
2380      else
2381        if(cnt==2){
2382          addToMap(res,"crs",cv);
2383          cnt++;
2384        }
2385        else
2386          addToMap(res,"dimensions",cv);
2387      icnt++;
2388      cv=strtok_r(NULL,",",&cvp);
2389    }
2390  }
2391  return res;
2392}
2393
2394/**
2395 * printBoundingBox : fill a BoundingBox node (ows:BoundingBox or
2396 * wps:BoundingBoxData). Set crs and dimensions attributes, add
2397 * Lower/UpperCorner nodes to a pre-existing XML node.
2398 */
2399void printBoundingBox(xmlNsPtr ns_ows,xmlNodePtr n,map* boundingbox){
2400
2401  xmlNodePtr bb,lw,uc;
2402
2403  map* tmp=getMap(boundingbox,"value");
2404
2405  tmp=getMap(boundingbox,"lowerCorner");
2406  if(tmp!=NULL){
2407    lw=xmlNewNode(ns_ows,BAD_CAST "LowerCorner");
2408    xmlAddChild(lw,xmlNewText(BAD_CAST tmp->value));
2409  }
2410
2411  tmp=getMap(boundingbox,"upperCorner");
2412  if(tmp!=NULL){
2413    uc=xmlNewNode(ns_ows,BAD_CAST "UpperCorner");
2414    xmlAddChild(uc,xmlNewText(BAD_CAST tmp->value));
2415  }
2416
2417  tmp=getMap(boundingbox,"crs");
2418  if(tmp!=NULL)
2419    xmlNewProp(n,BAD_CAST "crs",BAD_CAST tmp->value);
2420
2421  tmp=getMap(boundingbox,"dimensions");
2422  if(tmp!=NULL)
2423    xmlNewProp(n,BAD_CAST "dimensions",BAD_CAST tmp->value);
2424
2425  xmlAddChild(n,lw);
2426  xmlAddChild(n,uc);
2427
2428}
2429
2430void printBoundingBoxDocument(maps* m,maps* boundingbox,FILE* file){
2431  if(file==NULL)
2432    rewind(stdout);
2433  xmlNodePtr n;
2434  xmlDocPtr doc;
2435  xmlNsPtr ns_ows,ns_xsi;
2436  xmlChar *xmlbuff;
2437  int buffersize;
2438  char *encoding=getEncoding(m);
2439  map *tmp;
2440  if(file==NULL){
2441    int pid=0;
2442    tmp=getMapFromMaps(m,"lenv","sid");
2443    if(tmp!=NULL)
2444      pid=atoi(tmp->value);
2445    if(pid==getpid()){
2446      printf("Content-Type: text/xml; charset=%s\r\nStatus: 200 OK\r\n\r\n",encoding);
2447    }
2448    fflush(stdout);
2449  }
2450
2451  doc = xmlNewDoc(BAD_CAST "1.0");
2452  int owsId=zooXmlAddNs(NULL,"http://www.opengis.net/ows/1.1","ows");
2453  ns_ows=usedNs[owsId];
2454  n = xmlNewNode(ns_ows, BAD_CAST "BoundingBox");
[216]2455  xmlNewNs(n,BAD_CAST "http://www.opengis.net/ows/1.1",BAD_CAST "ows");
[76]2456  int xsiId=zooXmlAddNs(n,"http://www.w3.org/2001/XMLSchema-instance","xsi");
2457  ns_xsi=usedNs[xsiId];
2458  xmlNewNsProp(n,ns_xsi,BAD_CAST "schemaLocation",BAD_CAST "http://www.opengis.net/ows/1.1 http://schemas.opengis.net/ows/1.1.0/owsCommon.xsd");
2459  map *tmp1=getMap(boundingbox->content,"value");
2460  tmp=parseBoundingBox(tmp1->value);
2461  printBoundingBox(ns_ows,n,tmp);
2462  xmlDocSetRootElement(doc, n);
2463
2464  xmlDocDumpFormatMemoryEnc(doc, &xmlbuff, &buffersize, encoding, 1);
2465  if(file==NULL)
[114]2466    printf("%s",xmlbuff);
[76]2467  else{
2468    fprintf(file,"%s",xmlbuff);
2469  }
2470
2471  if(tmp!=NULL){
2472    freeMap(&tmp);
2473    free(tmp);
2474  }
2475  xmlFree(xmlbuff);
2476  xmlFreeDoc(doc);
2477  xmlCleanupParser();
2478  zooXmlCleanupNs();
2479 
2480}
[280]2481
[281]2482
[364]2483char* getMd5(char* url){
[291]2484  EVP_MD_CTX md5ctx;
[364]2485  char* fresult=(char*)malloc((EVP_MAX_MD_SIZE+1)*sizeof(char));
[291]2486  unsigned char result[EVP_MAX_MD_SIZE];
2487  unsigned int len;
2488  EVP_DigestInit(&md5ctx, EVP_md5());
2489  EVP_DigestUpdate(&md5ctx, url, strlen(url));
2490  EVP_DigestFinal_ex(&md5ctx,result,&len);
2491  EVP_MD_CTX_cleanup(&md5ctx);
2492  int i;
2493  for(i = 0; i < len; i++){
2494    if(i>0){
2495      char *tmp=strdup(fresult);
2496      sprintf(fresult,"%s%02x", tmp,result[i]);
2497      free(tmp);
2498    }
2499    else
2500      sprintf(fresult,"%02x",result[i]);
2501  }
2502  return fresult;
2503}
2504
[280]2505/**
2506 * Cache a file for a given request
2507 */
2508void addToCache(maps* conf,char* request,char* content,int length){
2509  map* tmp=getMapFromMaps(conf,"main","cacheDir");
2510  if(tmp!=NULL){
[364]2511    char* md5str=getMd5(request);
[292]2512    char* fname=(char*)malloc(sizeof(char)*(strlen(tmp->value)+strlen(md5str)+6));
2513    sprintf(fname,"%s/%s.zca",tmp->value,md5str);
[291]2514#ifdef DEBUG
[280]2515    fprintf(stderr,"Cache list : %s\n",fname);
2516    fflush(stderr);
[291]2517#endif
[293]2518    FILE* fo=fopen(fname,"w+");
2519    fwrite(content,sizeof(char),length,fo);
2520    fclose(fo);
2521    free(md5str);
2522    free(fname);
[280]2523  }
2524}
2525
2526char* isInCache(maps* conf,char* request){
[291]2527  map* tmpM=getMapFromMaps(conf,"main","cacheDir");
2528  if(tmpM!=NULL){
[364]2529    char* md5str=getMd5(request);
[291]2530#ifdef DEBUG
2531    fprintf(stderr,"MD5STR : (%s)\n\n",md5str);
2532#endif
[392]2533    char* fname=(char*)malloc(sizeof(char)*(strlen(tmpM->value)+strlen(md5str)+6));
[292]2534    sprintf(fname,"%s/%s.zca",tmpM->value,md5str);
[280]2535    struct stat f_status;
2536    int s=stat(fname, &f_status);
[292]2537    if(s==0 && f_status.st_size>0){
2538      free(md5str);
2539      return fname;
2540    }
[291]2541    free(md5str);
2542    free(fname);
[280]2543  }
2544  return NULL;
2545}
[281]2546
2547/**
2548 * loadRemoteFile:
2549 * Try to load file from cache or download a remote file if not in cache
2550 */
[364]2551int loadRemoteFile(maps* m,map* content,HINTERNET hInternet,char *url){
[281]2552  HINTERNET res;
2553  char* fcontent;
2554  char* cached=isInCache(m,url);
2555  int fsize;
[379]2556  int hasF=-1;
[281]2557  if(cached!=NULL){
2558    struct stat f_status;
2559    int s=stat(cached, &f_status);
2560    if(s==0){
2561      fcontent=(char*)malloc(sizeof(char)*(f_status.st_size+1));
[375]2562      FILE* f=fopen(cached,"rb");
[392]2563      int len=fread(fcontent,f_status.st_size,1,f);
[281]2564      fsize=f_status.st_size;
[392]2565      fcontent[fsize]=0;
[281]2566    }
2567  }else{
2568    res=InternetOpenUrl(hInternet,url,NULL,0,INTERNET_FLAG_NO_CACHE_WRITE,0);
[379]2569    fcontent=(char*)malloc((res.nDataLen+1)*sizeof(char));
[281]2570    if(fcontent == NULL){
2571      return errorException(m, _("Unable to allocate memory."), "InternalError");
2572    }
2573    size_t dwRead;
2574    InternetReadFile(res, (LPVOID)fcontent, res.nDataLen, &dwRead);
2575    fcontent[res.nDataLen]=0;
2576    fsize=res.nDataLen;
2577  }
[344]2578  if(fsize==0){
2579    return errorException(m, _("Unable to download the file."), "InternalError");
2580  }
[360]2581
[282]2582  map* tmpMap=getMapOrFill(content,"value","");
[360]2583   
[281]2584  free(tmpMap->value);
2585  tmpMap->value=(char*)malloc((fsize+1)*sizeof(char));
[379]2586  if(tmpMap->value==NULL)
2587    fprintf(stderr,"Unable to allocate memory!\n");
[392]2588  //snprintf(tmpMap->value,(fsize+1)*sizeof(char),fcontent);
2589  memcpy(tmpMap->value,fcontent,(fsize+1)*sizeof(char));
[379]2590 
[281]2591  char ltmp1[256];
2592  sprintf(ltmp1,"%d",fsize);
2593  addToMap(content,"size",ltmp1);
2594  if(cached==NULL)
2595    addToCache(m,url,fcontent,fsize);
[379]2596  else{
[378]2597    free(cached);
[379]2598  }
[364]2599  return 0;
[281]2600}
2601
[284]2602int errorException(maps *m, const char *message, const char *errorcode) 
2603{
2604  map* errormap = createMap("text", message);
2605  addToMap(errormap,"code", errorcode);
2606  printExceptionReportResponse(m,errormap);
2607  freeMap(&errormap);
2608  free(errormap);
2609  return -1;
2610}
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