Changeset 384


Ignore:
Timestamp:
Jan 9, 2013, 11:52:44 PM (11 years ago)
Author:
djay
Message:

Fix asynchronous support on windows platform, fix storage of responseDocument and add a sample service in Python language using the ZOO-API. Update makefile.vc and nmake.opt to remove unneeded cgic linkage. Fix for headers section to display only if needed.

Location:
trunk/zoo-project
Files:
2 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/zoo-project/zoo-kernel/makefile.vc

    r366 r384  
    6262
    6363zoo_loader.cgi: zoo_loader.obj zoo_service_loader.obj service_internal.obj $(PY_FILE) $(JAVA_FILE) $(MS_FILE) $(JS_FILE) ulinet.obj lex.cr.obj lex.sr.obj service_conf.tab.obj main_conf_read.tab.obj dirent.obj
    64         link zoo_loader.obj dirent.obj service_internal.obj $(PY_FILE) $(JAVA_FILE) $(MS_FILE) $(JS_FILE) ulinet.obj main_conf_read.tab.obj lex.cr.obj service_conf.tab.obj lex.sr.obj  zoo_service_loader.obj /out:zoo_loader.cgi $(LDFLAGS)
     64        link zoo_loader.obj dirent.obj service_internal.obj $(PY_FILE) $(JAVA_FILE) $(MS_FILE) $(JS_FILE) ulinet.obj main_conf_read.tab.obj lex.cr.obj service_conf.tab.obj lex.sr.obj  zoo_service_loader.obj /out:zoo_loader.cgi $(LDFLAGS) $(LDFLAGSCGI)
    6565
    6666clean:
  • trunk/zoo-project/zoo-kernel/nmake.opt

    r375 r384  
    3838CFLAGS=$(CFLAGS1) /nologo /MD /W3 /EHsc /Ox /D_CRT_SECURE_NO_WARNINGS /DWIN32 $(CJFLAGS) -I$(ZOOK_DIR) -I./ $(JAVA_CFLAGS) $(MS_CFLAGS) -I$(TROOT)\..\..\thirds\dirent-win32 -I$(INTL_DIR) -I$(CURL_DIR)\include -I$(XML2_DIR)\include -I$(GDAL_DIR)\port $(JS_CFLAGS) -I$(GDAL_DIR)\ogr -I$(GDAL_DIR)\gcore -I$(GD_DIR) -I$(ICONV_DIR) -I$(TROOT)\..\..\thirds\include -I$(TROOT)\..\..\thirds\cgic206 -I$(PYTHON_CPATH)\include -I$(SSL_DIR)/inc32 -I$(FCGI_DIR)\include $(PY_CFLAGS) -DLINUX_FREE_ISSUE #-DDEBUG #-DDEBUG_SERVICE_CONF
    3939
    40 LDFLAGS=$(FCGI_LIBRARY) $(CURL_LIBRARY) $(PY_LDFLAGS) $(XML2_LIBRARY) $(TROOT)/../../thirds/cgic206/libcgic.lib $(SSL_DIR)/out32dll/libeay32.lib $(JAVA_LDFLAGS) $(SSL_DIR)/out32dll/ssleay32.lib $(MS_LDFLAGS) $(INTL_DIR)/intl.lib $(XML2_DIR)/win32/bin.msvc/libxml2.lib $(GDAL_DIR)/gdal_i.lib $(CURL_DIR)/lib/libcurl.lib $(JS_LDFLAGS) /machine:i386
     40LDFLAGSCGI=$(TROOT)/../../thirds/cgic206/libcgic.lib
     41LDFLAGS=$(FCGI_DIR)/libfcgi/Release/libfcgi.lib $(CURL_LIBRARY) $(PY_LDFLAGS) $(XML2_LIBRARY) $(SSL_DIR)/out32dll/libeay32.lib $(JAVA_LDFLAGS) $(SSL_DIR)/out32dll/ssleay32.lib $(MS_LDFLAGS) $(INTL_DIR)/intl.lib $(XML2_DIR)/win32/bin.msvc/libxml2.lib $(GDAL_DIR)/gdal_i.lib $(CURL_DIR)/lib/libcurl.lib $(JS_LDFLAGS) /machine:i386
  • trunk/zoo-project/zoo-kernel/service_internal.c

    r383 r384  
    7878
    7979void 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';
     80  LPWSTR lpszTmp;
     81  BOOL fInit;
     82  char *s=NULL;
     83  map *tmpMap=getMapFromMaps(conf,"lenv","sid");
     84  if(hMapObjectG==NULL)
     85    hMapObjectG = CreateFileMapping(
     86                                    INVALID_HANDLE_VALUE,   // use paging file
     87                                    NULL,                   // default security attributes
     88                                    PAGE_READWRITE,         // read/write access
     89                                    0,                      // size: high 32-bits
     90                                    SHMEMSIZE,              // size: low 32-bits
     91                                    TEXT(tmpMap->value));   // name of map object
     92  if (hMapObjectG == NULL){
     93    fprintf(stderr,"Unable to create share memory segment %s !! \n",tmpMap->value);
     94    return ;
     95  }
     96  fInit = (GetLastError() != ERROR_ALREADY_EXISTS);
     97  if(lpvMemG==NULL)
     98    lpvMemG = MapViewOfFile(
     99                            hMapObjectG,     // object to map view of
     100                            FILE_MAP_WRITE, // read/write access
     101                            0,              // high offset:  map from
     102                            0,              // low offset:   beginning
     103                            0);             // default: map entire file
     104  if (lpvMemG == NULL){
     105    fprintf(stderr,"Unable to create or access the shared memory segment %s !! \n",tmpMap->value);
     106    return ;
     107  }
     108  if (fInit)
     109    memset(lpvMemG, '\0', SHMEMSIZE);
     110  tmpMap=getMapFromMaps(conf,"lenv","status");
     111  lpszTmp = (LPWSTR) lpvMemG;
     112  for(s=tmpMap->value;*s!=NULL;s++)
     113    *lpszTmp++ = *s;
     114  *lpszTmp = '\0';
    125115}
    126116
     
    159149    return "-1";
    160150  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;
     151  return (char*)lpszTmp;
    167152}
    168153
     
    13911376  char *encoding=getEncoding(m);
    13921377  if(pid==getpid()){
     1378    printHeaders(m);
    13931379    printf("Content-Type: text/xml; charset=%s\r\nStatus: 200 OK\r\n\r\n",encoding);
    13941380  }
     
    17451731  xmlNodePtr n;
    17461732
    1747   printHeaders(m);
    17481733  doc = xmlNewDoc(BAD_CAST "1.0");
    17491734  maps* tmpMap=getMaps(m,"main");
     
    17521737    map *tmpSid=getMapFromMaps(m,"lenv","sid");
    17531738    if(tmpSid!=NULL){
    1754       if( getpid()==atoi(tmpSid->value) )
     1739      if( getpid()==atoi(tmpSid->value) ){
     1740        printHeaders(m);
    17551741        printf("Content-Type: text/xml; charset=%s\r\nStatus: 200 OK\r\n\r\n",encoding);
    1756     }
    1757     else
     1742      }
     1743    }
     1744    else{
     1745      printHeaders(m);
    17581746      printf("Content-Type: text/xml; charset=%s\r\nStatus: 200 OK\r\n\r\n",encoding);
     1747    }
    17591748  }else
    17601749    printf("Content-Type: text/xml; charset=%s\r\nStatus: 200 OK\r\n\r\n",encoding);
     
    18621851  }
    18631852 
    1864   printHeaders(m);
    1865 
    18661853  if(asRaw==0){
    18671854#ifdef DEBUG
     
    20071994        if(rs!=NULL)
    20081995          printf("Content-Length: %s\r\n",rs->value);
    2009 
     1996        printHeaders(m);
    20101997        char mime[1024];
    20111998        map* mi=getMap(tmpI->content,"mimeType");
  • trunk/zoo-project/zoo-kernel/service_internal_js.c

    r383 r384  
    103103 
    104104  /* Create a context. */
    105   cx = JS_NewContext(rt,81920);
     105  cx = JS_NewContext(rt,8192);
    106106  if (cx == NULL){
    107107    return 1;
  • trunk/zoo-project/zoo-kernel/zoo_service_loader.c

    r381 r384  
    431431}
    432432
     433
    433434#ifdef WIN32
    434435/**
     
    449450  char *dataInputsKVP=getMapsAsKVP(inputs,cgiContentLength,0);
    450451  char *dataOutputsKVP=getMapsAsKVP(outputs,cgiContentLength,1);
     452#ifdef DEBUG
    451453  fprintf(stderr,"DATAINPUTSKVP %s\n",dataInputsKVP);
    452454  fprintf(stderr,"DATAOUTPUTSKVP %s\n",dataOutputsKVP);
     455#endif
    453456  map *sid=getMapFromMaps(m,"lenv","sid");
    454457  map* r_inputs=getMapFromMaps(m,"main","tmpPath");
    455   map* r_inputs1=getMap(s1->content,"ServiceProvider");
     458  map* r_inputs1=getMap(request_inputs,"metapath");
     459  int hasIn=-1;
     460  if(r_inputs1==NULL){
     461    r_inputs1=createMap("metapath","");
     462    hasIn=1;
     463  }
    456464  map* r_inputs2=getMap(s1->content,"ResponseDocument");
    457465  if(r_inputs2==NULL)
     
    460468
    461469  if(r_inputs2!=NULL){
    462     sprintf(tmp,"\"request=%s&service=WPS&version=1.0.0&Identifier=%s&DataInputs=%s&%s=%s&cgiSid=%s\"",req->value,id->value,dataInputsKVP,r_inputs2->name,r_inputs2->value,sid->value);
    463         sprintf(tmpq,"request=%s&service=WPS&version=1.0.0&Identifier=%s&DataInputs=%s&%s=%s",req->value,id->value,dataInputsKVP,r_inputs2->name,dataOutputsKVP);
     470    sprintf(tmp,"\"metapath=%s&request=%s&service=WPS&version=1.0.0&Identifier=%s&DataInputs=%s&%s=%s&cgiSid=%s\"",r_inputs1->value,req->value,id->value,dataInputsKVP,r_inputs2->name,r_inputs2->value,sid->value);
     471    sprintf(tmpq,"metapath=%s&request=%s&service=WPS&version=1.0.0&Identifier=%s&DataInputs=%s&%s=%s",r_inputs1->value,req->value,id->value,dataInputsKVP,r_inputs2->name,dataOutputsKVP);
    464472  }
    465473  else{
    466     sprintf(tmp,"\"request=%s&service=WPS&version=1.0.0&Identifier=%s&DataInputs=%s&cgiSid=%s\"",req->value,id->value,dataInputsKVP,sid->value);
    467     sprintf(tmpq,"request=%s&service=WPS&version=1.0.0&Identifier=%s&DataInputs=%s",req->value,id->value,dataInputsKVP,sid->value);
    468   }
    469 
     474    sprintf(tmp,"\"metapath=%s&request=%s&service=WPS&version=1.0.0&Identifier=%s&DataInputs=%s&cgiSid=%s\"",r_inputs1->value,req->value,id->value,dataInputsKVP,sid->value);
     475    sprintf(tmpq,"metapath=%s&request=%s&service=WPS&version=1.0.0&Identifier=%s&DataInputs=%s",r_inputs1->value,req->value,id->value,dataInputsKVP,sid->value);
     476  }
     477 
     478  if(hasIn>0){
     479    freeMap(&r_inputs1);
     480    free(r_inputs1);
     481  }
    470482  char *tmp1=strdup(tmp);
    471483  sprintf(tmp,"zoo_loader.cgi %s \"%s\"",tmp1,sid->value);
    472 
     484 
    473485  free(dataInputsKVP);
    474486  free(dataOutputsKVP);
     487  //printf("REQUEST IS : %s \n",tmp);
     488#ifdef DEBUG
    475489  fprintf(stderr,"REQUEST IS : %s \n",tmp);
     490#endif
    476491  SetEnvironmentVariable("CGISID",TEXT(sid->value));
    477492  SetEnvironmentVariable("QUERY_STRING",TEXT(tmpq));
     
    492507      )
    493508    {
     509      //printf("CreateProcess failed (%d).\n",GetLastError() );
     510#ifdef DEBUG
    494511      fprintf( stderr, "CreateProcess failed (%d).\n", GetLastError() );
     512#endif
    495513      return ;
    496514    }else{
     515    //printf("CreateProcess successfull (%d).\n",GetLastError() );
     516#ifdef DEBUG
    497517    fprintf( stderr, "CreateProcess successfull (%d).\n\n\n\n", GetLastError() );
     518#endif
    498519  }
    499520  CloseHandle( pi.hProcess );
    500521  CloseHandle( pi.hThread );
     522  //printf("CreateProcess finished !\n");
     523#ifdef DEBUG
    501524  fprintf(stderr,"CreateProcess finished !\n");
     525#endif
    502526}
    503527#endif
     
    17011725        }
    17021726        /**
    1703          * Get every attribute from a LiteralData node
    1704          * storeExecuteResponse, lineage, status
     1727         * Get every attribute: storeExecuteResponse, lineage, status
    17051728         */
    17061729        const char *ress[3]={"storeExecuteResponse","lineage","status"};
     
    17421765              tmpmaps->next=NULL;
    17431766            }
    1744             else
    1745               tmpmaps->name=strdup((char*)val);;
     1767            else{
     1768              //free(tmpmaps->name);
     1769              tmpmaps->name=strdup((char*)val);
     1770            }
    17461771            xmlFree(val);
    17471772          }
     
    17641789            else{
    17651790              if(tmpmaps->content!=NULL)
    1766                 addToMap(tmpmaps->content,
    1767                          (char*)cur1->name,(char*)val);
     1791                addToMap(tmpmaps->content,(char*)cur1->name,(char*)val);
    17681792              else
    1769                 tmpmaps->content=
    1770                   createMap((char*)cur1->name,(char*)val);
     1793                tmpmaps->content=createMap((char*)cur1->name,(char*)val);
    17711794            }
    17721795            xmlFree(val);
     
    17951818            }
    17961819            xmlNodePtr cur2=cur1->children;
     1820            while(cur2!=NULL && cur2->type != XML_ELEMENT_NODE)
     1821              cur2=cur2->next;
    17971822            while(cur2){
    17981823              /**
     
    21252150  if(test1!=NULL){
    21262151    cgiSid=test1->value;
    2127   }
    2128   if(cgiSid!=NULL){
    21292152    addToMap(request_inputs,"storeExecuteResponse","true");
    21302153    addToMap(request_inputs,"status","true");
     2154    setMapInMaps(m,"lenv","sid",test1->value);
    21312155    status=getMap(request_inputs,"status");
    2132     //fprintf(stderr,"cgiSID : %s",cgiSid);
    2133   }
    2134 #endif
     2156    printf("cgiSid %s\n",cgiSid);
     2157  }
     2158#endif
     2159  int hrstd=-1;
     2160  char *fbkp,*fbkp1;
     2161  FILE *f0,*f1;
    21352162  if(status!=NULL)
    21362163    if(strcasecmp(status->value,"false")==0)
     
    21492176#else
    21502177    if(cgiSid==NULL){
    2151       addToMap(request_inputs,"cgSid",cgiSid);
    21522178      createProcess(m,request_inputs,s1,NULL,cpid,request_input_real_format,request_output_real_format);
    21532179      pid = cpid;
     
    21552181      pid=0;
    21562182      cpid=atoi(cgiSid);
    2157     }
    2158     fflush(stderr);
     2183      printf("cgiSid %s\n",cgiSid);
     2184    }
     2185    //printf("pid cpid %d %d\n",pid,cpid);
     2186    //fflush(stderr);
    21592187#endif
    21602188    if (pid > 0) {
     
    21742202      r_inputs=getMapFromMaps(m,"main","tmpPath");
    21752203      map* r_inputs1=getMap(s1->content,"ServiceProvider");
    2176       char* fbkp=(char*)malloc((strlen(r_inputs->value)+strlen(r_inputs1->value)+100)*sizeof(char));
     2204      fbkp=(char*)malloc((strlen(r_inputs->value)+strlen(r_inputs1->value)+1024)*sizeof(char));
    21772205      sprintf(fbkp,"%s/%s_%d.xml",r_inputs->value,r_inputs1->value,cpid);
    2178       char* flog=(char*)malloc((strlen(r_inputs->value)+strlen(r_inputs1->value)+100)*sizeof(char));
     2206      char* flog=(char*)malloc((strlen(r_inputs->value)+strlen(r_inputs1->value)+1024)*sizeof(char));
    21792207      sprintf(flog,"%s/%s_%d_error.log",r_inputs->value,r_inputs1->value,cpid);
    21802208#ifdef DEBUG
     
    21842212#endif
    21852213      freopen(flog,"w+",stderr);
    2186       freopen(fbkp , "w+", stdout);
     2214      f0=freopen(fbkp , "w+", stdout);
    21872215      fclose(stdin);
    2188       free(fbkp);
    21892216      free(flog);
    21902217      /**
     
    21942221       * this way the data will be updated at the end of the process run.
    21952222       */
    2196       updateStatus(m);
    21972223      printProcessResponse(m,request_inputs,cpid,
    21982224                           s1,r_inputs1->value,SERVICE_STARTED,
     
    22022228      fflush(stdout);
    22032229      rewind(stdout);
    2204 #endif
    2205 
     2230#else
     2231#endif
     2232      fbkp1=(char*)malloc((strlen(r_inputs->value)+strlen(r_inputs1->value)+1024)*sizeof(char));
     2233      sprintf(fbkp1,"%s/%s_final_%d.xml",r_inputs->value,r_inputs1->value,cpid);
     2234      f1=freopen(fbkp1 , "w+", stdout);
    22062235      loadServiceAndRun(&m,s1,request_inputs,&request_input_real_format,&request_output_real_format,&eres);
    2207 
    22082236    } else {
    22092237      /**
     
    22422270    fclose(stderr);
    22432271    unhandleStatus(m);
     2272    /**
     2273     * Dump back the final file fbkp1 to fbkp
     2274     */
     2275    fclose(f0);
     2276    fclose(f1);
     2277    FILE* f2=fopen(fbkp1,"rb");
     2278    FILE* f3=fopen(fbkp,"wb+");
     2279    free(fbkp);
     2280    free(fbkp1);
     2281    fseek(f2,0,SEEK_END);
     2282    long flen=ftell(f2);
     2283    fseek(f2,0,SEEK_SET);
     2284    char *tmps1=(char*)malloc((flen+1)*sizeof(char));
     2285    fread(tmps1,flen,1,f2);
     2286    fwrite(tmps1,1,flen,f3);
     2287    fclose(f2);
     2288    fclose(f3);
    22442289  }
    22452290
  • trunk/zoo-project/zoo-services/utils/status/makefile.vc

    r216 r384  
    1 ZOODIR=../../../zoo-kernel
    2 THIRDSDIR=../../../thirds
    3 !INCLUDE $(ZOODIR)/nmake.opt
    4 CFLAGS=-DWIN32 -I$(THIRDSDIR)/dirent-win32 -I$(GEODIR)/include -I$(TPATH)/include -I$(ZOODIR)/ -I./ -DLINUX_FREE_ISSUE -DDEBUG
    5 CPP=cl /TP
     1TROOT= $(ZOOK_DIR)
     2!INCLUDE $(ZOOK_DIR)/nmake.opt
     3
     4FILES=$(ZOOK_DIR)/dirent.obj $(ZOOK_DIR)/service_internal.obj $(ZOOK_DIR)/ulinet.obj
     5!IFDEF JS_DIR
     6FILES=$(FILES) $(ZOOK_DIR)$(JS_FILE)
     7!ENDIF
     8!IFDEF JDK_DIR
     9FILES=$(FILES) $(ZOOK_DIR)$(JAVA_FILE)
     10!ENDIF
     11!IFDEF PY_DIR
     12FILES=$(FILES) $(ZOOK_DIR)$(PY_FILE)
     13!ENDIF
     14!IFDEF MS_DIR
     15FILES=$(FILES) $(ZOOK_DIR)$(MS_FILE)
     16!ENDIF
    617
    718cgi-env/wps_status.zo: service.c
    8         $(CPP) $(CFLAGS) /c service.c
    9         link /dll /out:cgi-env/wps_status.zo $(ZOODIR)/service_internal.obj $(ZOODIR)/dirent.obj ./service.obj -L$(TPATH)/lib/libssl32.dll.a $(TPATH)/lib/libxslt.lib $(TPATH)/lib/libxml2.lib $(TPATH)/lib/libeay32.dll.a $(TPATH)/lib/libcrypto.a $(TOOLS)/lib/libssl32.dll.a $(LIBINTL_CPATH)/lib/libintl.lib
     19        $(CPP) /D_CRT_NONSTDC_NO_DEPRECATE -DWIN32 -DZOO_SERVICE $(CFLAGS) /c service.c
     20        link /dll /out:cgi-env/wps_status.zo $(FILES) ./service.obj $(LDFLAGS) $(XSLT_DIR)\win32\bin.msvc\libxslt.lib /FORCE:MULTIPLE
    1021
    1122clean:
    12         del /f cgi-env\wps*
     23        erase cgi-env\*_status.*
     24        erase *.obj
  • trunk/zoo-project/zoo-services/utils/status/service.c

    r348 r384  
    2424
    2525#include "service.h"
    26 #ifdef WIN32
    27 #include <windows.h>
    28 #endif
     26#include "service_internal.h"
    2927
    3028extern "C" {
     
    4038
    4139#include <dirent.h>
    42 #include "service_internal.h"
    4340
    4441  /**
     
    7673        fprintf(stderr,"File : %s searched : %s\n",dp->d_name,tmp);
    7774#endif
    78         if(strstr(dp->d_name,tmp)!=0){
     75        if(strstr(dp->d_name,"final_")==0 && strstr(dp->d_name,tmp)!=0){
    7976          sprintf(fileName,"%s/%s",tmpTmap->value,dp->d_name);
    8077          hasFile=1;
     78          break;
    8179        }
    8280      }
     
    109107      xmlDocDumpFormatMemory(res, &xmlbuff, &buffersize, 1);
    110108      setMapInMaps(outputs,"Result","value",(char*)xmlbuff);
    111       setMapInMaps(outputs,"Result","mimeType","text/xml");
    112       setMapInMaps(outputs,"Result","encoding","UTF-8");
    113109      xmlFree(xmlbuff);
    114110    }
Note: See TracChangeset for help on using the changeset viewer.

Search

Context Navigation

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