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

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

Remove the list file and directly name zca files using the md5 of the URL.

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