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

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

Fix wrong UOMs node from DescribeProcess? #59

File size: 67.7 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
2301/**
2302 * Cache a file for a given request
2303 */
2304void addToCache(maps* conf,char* request,char* content,int length){
2305  map* tmp=getMapFromMaps(conf,"main","cacheDir");
2306  if(tmp!=NULL){
2307    char* fname=(char*)malloc(sizeof(char)*(strlen(tmp->value)+6));
2308    sprintf(fname,"%s/list",tmp->value);
2309    fprintf(stderr,"Cache list : %s\n",fname);
2310    fflush(stderr);
2311    struct stat f_status;
2312    int s=stat(fname, &f_status);
2313    /**
2314     * If the file does not exist, create it
2315     */
2316    if(s<0){
2317      FILE* f=fopen(fname,"w+");
2318      if(f)
2319        fclose(f);
2320      s=stat(fname, &f_status);
2321    }
2322    if(f_status.st_size>=0){
2323      FILE* f=fopen(fname,"a+");
2324      char* foname=(char*)malloc(sizeof(char)*(strlen(tmp->value)+64));
2325      sprintf(foname,"%s/%d.zca",tmp->value,f_status.st_size);
2326      fprintf(stderr,"Cache file : %s\n",foname);
2327      fflush(stderr);
2328      FILE* fo=fopen(foname,"w+");
2329      char *fcontent=(char*)malloc(sizeof(char)*(strlen(foname)+strlen(request)+3));
2330      sprintf(fcontent,"%s|%s\n",request,foname);
2331
2332      fwrite(fcontent,sizeof(char),strlen(fcontent),f);
2333      fwrite(content,sizeof(char),length,fo);
2334      fclose(f);
2335      fclose(fo);
2336    }
2337  }
2338}
2339
2340char* isInCache(maps* conf,char* request){
2341  map* tmp=getMapFromMaps(conf,"main","cacheDir");
2342  if(tmp!=NULL){
2343    char* fname=(char*)malloc(sizeof(char)*(strlen(tmp->value)+6));
2344    sprintf(fname,"%s/list",tmp->value);
2345    struct stat f_status;
2346    int s=stat(fname, &f_status);
2347    if(s==0){
2348      char* fcontent=(char*)malloc(sizeof(char)*(f_status.st_size+1));
2349      FILE* f=fopen(fname,"r");
2350      fread(fcontent,sizeof(char),f_status.st_size,f);
2351      char *tmp,*svt;
2352      tmp=strtok_r(fcontent,"\n",&svt);
2353      int lin=0;
2354      while(tmp!=NULL){
2355        char *tmp1,*svt1;
2356        tmp1=strtok_r(tmp,"|",&svt1);
2357        int hv=-1;
2358        while(tmp1!=NULL){
2359          fprintf(stderr,"%s %s\n",tmp1,request);
2360          if(hv>0)
2361            return tmp1;
2362          if(strcasecmp(tmp1,request)==0)
2363            hv=1;
2364          tmp1=strtok_r(NULL,"|",&svt1);
2365        }
2366        lin++;
2367        tmp = strtok_r(NULL,"\n",&svt);
2368      }
2369      fclose(f);
2370    }
2371  }
2372  return NULL;
2373}
2374
2375/**
2376 * loadRemoteFile:
2377 * Try to load file from cache or download a remote file if not in cache
2378 */
2379void loadRemoteFile(maps* m,map* content,HINTERNET hInternet,char *url){
2380  HINTERNET res;
2381  char* fcontent;
2382  char* cached=isInCache(m,url);
2383  int fsize;
2384  if(cached!=NULL){
2385    struct stat f_status;
2386    int s=stat(cached, &f_status);
2387    if(s==0){
2388      fcontent=(char*)malloc(sizeof(char)*(f_status.st_size+1));
2389      FILE* f=fopen(cached,"r");
2390      fread(fcontent,sizeof(char),f_status.st_size,f);
2391      fsize=f_status.st_size;
2392    }
2393  }else{
2394    res=InternetOpenUrl(hInternet,url,NULL,0,INTERNET_FLAG_NO_CACHE_WRITE,0);
2395    fcontent=(char*)calloc((res.nDataLen+1),sizeof(char));
2396    if(fcontent == NULL){
2397      return errorException(m, _("Unable to allocate memory."), "InternalError");
2398    }
2399    size_t dwRead;
2400    InternetReadFile(res, (LPVOID)fcontent, res.nDataLen, &dwRead);
2401    fcontent[res.nDataLen]=0;
2402    fsize=res.nDataLen;
2403  }
2404  map* tmpMap=getMapOrFill(content,"value","");
2405  free(tmpMap->value);
2406  tmpMap->value=(char*)malloc((fsize+1)*sizeof(char));
2407  memcpy(tmpMap->value,fcontent,(fsize)*sizeof(char)); 
2408  char ltmp1[256];
2409  sprintf(ltmp1,"%d",fsize);
2410  addToMap(content,"size",ltmp1);
2411  if(cached==NULL)
2412    addToCache(m,url,fcontent,fsize);
2413  dumpMap(content);
2414  free(fcontent);
2415}
2416
2417int errorException(maps *m, const char *message, const char *errorcode) 
2418{
2419  map* errormap = createMap("text", message);
2420  addToMap(errormap,"code", errorcode);
2421  printExceptionReportResponse(m,errormap);
2422  freeMap(&errormap);
2423  free(errormap);
2424  return -1;
2425}
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