Ignore:
Timestamp:
Feb 8, 2018, 12:37:09 PM (7 years ago)
Author:
djay
Message:

Use correct declaration of the zo_DS variable in libzoo_service.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/prototype-v0/zoo-project/zoo-kernel/zoo_service_loader.c

    r861 r865  
    15581558                        /**
    15591559                         * No support for dot in service name stored in metadb!?
    1560 #ifdef META_DB
    1561                         service* s2=extractServiceFromDb(m,tmpMapI->value,0);
    1562                         if(s2==NULL){
    1563 #endif
     1560                         #ifdef META_DB
     1561                         service* s2=extractServiceFromDb(m,tmpMapI->value,0);
     1562                         if(s2==NULL){
     1563                         #endif
    15641564                        */
    1565                           s1 = (service *) malloc (SERVICE_SIZE);
    1566                           t = readServiceFile (m, buff1, &s1, tmpMapI->value);
    1567                           if (t < 0)
    1568                             {
    1569                               map *tmp00 = getMapFromMaps (m, "lenv", "message");
    1570                               char tmp01[1024];
    1571                               if (tmp00 != NULL)
    1572                                 sprintf (tmp01,
    1573                                          _
    1574                                          ("Unable to parse the ZCFG file for the following ZOO-Service: %s. Message: %s"),
    1575                                          tmps, tmp00->value);
    1576                               else
    1577                                 sprintf (tmp01,
    1578                                          _
    1579                                          ("Unable to parse the ZCFG file for the following ZOO-Service: %s."),
    1580                                          tmps);
    1581                               dup2 (saved_stdout, fileno (stdout));
    1582                               errorException (m, tmp01, "InvalidParameterValue",
    1583                                               "identifier");
    1584                               freeMaps (&m);
    1585                               free (m);
    1586                               if(zooRegistry!=NULL){
    1587                                 freeRegistry(&zooRegistry);
    1588                                 free(zooRegistry);
    1589                               }
    1590                               free (REQUEST);
    1591                               free (corig);
    1592                               free (orig);
    1593                               free (SERVICE_URL);
    1594                               free (s1);
    1595                               closedir (dirp);
    1596                               //xmlFreeDoc (doc);
    1597                               xmlCleanupParser ();
    1598                               zooXmlCleanupNs ();
    1599                               return 1;
     1565                        s1 = (service *) malloc (SERVICE_SIZE);
     1566                        t = readServiceFile (m, buff1, &s1, tmpMapI->value);
     1567                        if (t < 0)
     1568                          {
     1569                            map *tmp00 = getMapFromMaps (m, "lenv", "message");
     1570                            char tmp01[1024];
     1571                            if (tmp00 != NULL)
     1572                              sprintf (tmp01,
     1573                                       _
     1574                                       ("Unable to parse the ZCFG file for the following ZOO-Service: %s. Message: %s"),
     1575                                       tmps, tmp00->value);
     1576                            else
     1577                              sprintf (tmp01,
     1578                                       _
     1579                                       ("Unable to parse the ZCFG file for the following ZOO-Service: %s."),
     1580                                       tmps);
     1581                            dup2 (saved_stdout, fileno (stdout));
     1582                            errorException (m, tmp01, "InvalidParameterValue",
     1583                                            "identifier");
     1584                            freeMaps (&m);
     1585                            free (m);
     1586                            if(zooRegistry!=NULL){
     1587                              freeRegistry(&zooRegistry);
     1588                              free(zooRegistry);
    16001589                            }
    1601 #ifdef DEBUG
    1602                           dumpService (s1);
    1603 #endif
    1604                           inheritance(zooRegistry,&s1);
     1590                            free (REQUEST);
     1591                            free (corig);
     1592                            free (orig);
     1593                            free (SERVICE_URL);
     1594                            free (s1);
     1595                            closedir (dirp);
     1596                            //xmlFreeDoc (doc);
     1597                            xmlCleanupParser ();
     1598                            zooXmlCleanupNs ();
     1599                            return 1;
     1600                          }
     1601#ifdef DEBUG
     1602                        dumpService (s1);
     1603#endif
     1604                        inheritance(zooRegistry,&s1);
    16051605#ifdef USE_HPC
    1606                           addNestedOutputs(&s1);
    1607 #endif
    1608                           printDescribeProcessForProcess (zooRegistry, m, doc, n, s1);
    1609                           freeService (&s1);
    1610                           free (s1);
    1611                           s1 = NULL;
    1612                           scount++;
    1613                           hasVal = 1;
    1614                           setMapInMaps (m, "lenv", "level", "0");
    1615                           /*
    1616 #ifdef META_DB
    1617                         }
    1618 #endif
    1619                           */
     1606                        addNestedOutputs(&s1);
     1607#endif
     1608                        printDescribeProcessForProcess (zooRegistry, m, doc, n, s1);
     1609                        freeService (&s1);
     1610                        free (s1);
     1611                        s1 = NULL;
     1612                        scount++;
     1613                        hasVal = 1;
     1614                        setMapInMaps (m, "lenv", "level", "0");
     1615                        /*
     1616                          #ifdef META_DB
     1617                          }
     1618                          #endif
     1619                        */
    16201620                      }
    16211621                    else
     
    16401640                        }else /*TOTO*/{
    16411641#endif
    1642                         memset (buff, 0, 256);
    1643                         snprintf (buff, 256, "%s.zcfg", corig);
    1644                         memset (buff1, 0, 1024);
     1642                          memset (buff, 0, 256);
     1643                          snprintf (buff, 256, "%s.zcfg", corig);
     1644                          memset (buff1, 0, 1024);
    16451645#ifdef DEBUG
    16461646                          printf ("\n#######%s\n########\n", buff);
     
    17741774#ifdef META_DB
    17751775            close_sql(m,0);
    1776       //end_sql();
     1776            //end_sql();
    17771777#endif
    17781778            return 0;
     
    17821782            map* version=getMapFromMaps(m,"main","rversion");
    17831783            int vid=getVersionId(version->value);           
    1784                 int len = 0;
    1785                 int j = 0;
     1784            int len = 0;
     1785            int j = 0;
    17861786            for(j=0;j<nbSupportedRequests;j++){
    17871787              if(requests[vid][j]!=NULL)
     
    18581858  map* import = getMapFromMaps (m, IMPORTSERVICE, r_inputs->value);
    18591859  if (import != NULL && import->value != NULL) {
    1860       strncpy(tmps1, import->value, 1024);
    1861       setMapInMaps (m, "lenv", "Identifier", r_inputs->value);
    1862       setMapInMaps (m, "lenv", "oIdentifier", r_inputs->value);
     1860    strncpy(tmps1, import->value, 1024);
     1861    setMapInMaps (m, "lenv", "Identifier", r_inputs->value);
     1862    setMapInMaps (m, "lenv", "oIdentifier", r_inputs->value);
    18631863  }
    18641864  else {
     
    19051905  }else /* Not found in MetaDB */{
    19061906#endif
    1907   s1 = (service *) malloc (SERVICE_SIZE);
    1908   if (s1 == NULL)
    1909     {
    1910       freeMaps (&m);
    1911       free (m);
    1912       if(zooRegistry!=NULL){
    1913         freeRegistry(&zooRegistry);
    1914         free(zooRegistry);
     1907    s1 = (service *) malloc (SERVICE_SIZE);
     1908    if (s1 == NULL)
     1909      {
     1910        freeMaps (&m);
     1911        free (m);
     1912        if(zooRegistry!=NULL){
     1913          freeRegistry(&zooRegistry);
     1914          free(zooRegistry);
     1915        }
     1916        free (REQUEST);
     1917        free (SERVICE_URL);
     1918        return errorException (m, _("Unable to allocate memory"),
     1919                               "InternalError", NULL);
    19151920      }
    1916       free (REQUEST);
    1917       free (SERVICE_URL);
    1918       return errorException (m, _("Unable to allocate memory"),
    1919                              "InternalError", NULL);
    1920     }
    1921 
    1922   int saved_stdout = dup (fileno (stdout));
    1923   dup2 (fileno (stderr), fileno (stdout));
    1924   t = readServiceFile (m, tmps1, &s1, r_inputs->value);
    1925   inheritance(zooRegistry,&s1);
     1921
     1922    int saved_stdout = dup (fileno (stdout));
     1923    dup2 (fileno (stderr), fileno (stdout));
     1924    t = readServiceFile (m, tmps1, &s1, r_inputs->value);
     1925    inheritance(zooRegistry,&s1);
    19261926#ifdef USE_HPC
    1927   addNestedOutputs(&s1);
    1928 #endif
    1929   if(zooRegistry!=NULL){
    1930     freeRegistry(&zooRegistry);
    1931     free(zooRegistry);
    1932   }
    1933   fflush (stdout);
    1934   dup2 (saved_stdout, fileno (stdout));
    1935   if (t < 0)
    1936     {
    1937       char *tmpMsg = (char *) malloc (2048 + strlen (r_inputs->value));
    1938       sprintf (tmpMsg,
    1939               _
    1940               ("The value for <identifier> seems to be wrong (%s). Please specify one of the processes in the list returned by a GetCapabilities request."),
    1941               r_inputs->value);
    1942       errorException (m, tmpMsg, "InvalidParameterValue", "identifier");
    1943       free (tmpMsg);
    1944       free (s1);
    1945       freeMaps (&m);
    1946       free (m);
    1947       free (REQUEST);
    1948       free (SERVICE_URL);
    1949       return 0;
    1950     }
    1951   close (saved_stdout);
     1927    addNestedOutputs(&s1);
     1928#endif
     1929    if(zooRegistry!=NULL){
     1930      freeRegistry(&zooRegistry);
     1931      free(zooRegistry);
     1932    }
     1933    fflush (stdout);
     1934    dup2 (saved_stdout, fileno (stdout));
     1935    if (t < 0)
     1936      {
     1937        char *tmpMsg = (char *) malloc (2048 + strlen (r_inputs->value));
     1938        sprintf (tmpMsg,
     1939                _
     1940                ("The value for <identifier> seems to be wrong (%s). Please specify one of the processes in the list returned by a GetCapabilities request."),
     1941                r_inputs->value);
     1942        errorException (m, tmpMsg, "InvalidParameterValue", "identifier");
     1943        free (tmpMsg);
     1944        free (s1);
     1945        freeMaps (&m);
     1946        free (m);
     1947        free (REQUEST);
     1948        free (SERVICE_URL);
     1949        return 0;
     1950      }
     1951    close (saved_stdout);
    19521952#ifdef META_DB
    19531953  }
     
    23292329      fprintf (stderr, "\nPID : %d\n", cpid);
    23302330#endif
    2331 
    23322331#ifndef WIN32
    23332332      pid = fork ();
     
    23352334      if (cgiSid == NULL)
    23362335        {
    2337           createProcess (m, request_inputs, s1, NULL, cpid,
    2338                         request_input_real_format,
    2339                         request_output_real_format);
    2340           pid = cpid;
     2336          createProcess (m, request_inputs, s1, NULL, cpid,
     2337                        request_input_real_format,
     2338                        request_output_real_format);
     2339          pid = cpid;
    23412340        }
    23422341      else
    23432342        {
    2344           pid = 0;
    2345           cpid = atoi (cgiSid);
     2343          pid = 0;
     2344          cpid = atoi (cgiSid);
    23462345          updateStatus(m,0,_("Initializing"));
    23472346        }
    23482347#endif
    2349       //InternetCloseHandle (&hInternet);
    23502348      if (pid > 0)
    2351         {
    2352           /**
    2353            * dady :
    2354            * set status to SERVICE_ACCEPTED
    2355            */
    2356 #ifdef DEBUG
    2357           fprintf (stderr, "father pid continue (origin %d) %d ...\n", cpid,
    2358                    getpid ());
    2359 #endif
    2360           eres = SERVICE_ACCEPTED;
    2361         }
     2349        {
     2350          //
     2351          // dady :
     2352          // set status to SERVICE_ACCEPTED
     2353          //
     2354#ifdef DEBUG
     2355          fprintf (stderr, "father pid continue (origin %d) %d ...\n", cpid,
     2356                   getpid ());
     2357#endif
     2358          eres = SERVICE_ACCEPTED;
     2359        }
    23622360      else if (pid == 0)
    2363         {
    2364           /**
    2365            * son : have to close the stdout, stdin and stderr to let the parent
    2366            * process answer to http client.
    2367            */
     2361        {
     2362          //
     2363          // son : have to close the stdout, stdin and stderr to let the parent
     2364          // process answer to http client.
     2365          //
    23682366          map* usid = getMapFromMaps (m, "lenv", "uusid");
    2369           map* tmpm = getMapFromMaps (m, "lenv", "osid");
    2370           int cpid = atoi (tmpm->value);
    2371           r_inputs = getMapFromMaps (m, "main", "tmpPath");
    2372           setMapInMaps (m, "lenv", "async","true");
     2367          map* tmpm = getMapFromMaps (m, "lenv", "osid");
     2368          int cpid = atoi (tmpm->value);
     2369          pid=cpid;
     2370          r_inputs = getMapFromMaps (m, "main", "tmpPath");
     2371          setMapInMaps (m, "lenv", "async","true");
    23732372          map* r_inputs1 = createMap("ServiceName", s1->name);
    23742373
    23752374          // Create the filename for the result file (.res)
    2376           fbkpres =
    2377             (char *)
    2378             malloc ((strlen (r_inputs->value) +
    2379                      strlen (usid->value) + 7) * sizeof (char));                   
    2380           sprintf (fbkpres, "%s/%s.res", r_inputs->value, usid->value);
     2375          fbkpres =
     2376            (char *)
     2377            malloc ((strlen (r_inputs->value) +
     2378                     strlen (usid->value) + 7) * sizeof (char));                   
     2379          sprintf (fbkpres, "%s/%s.res", r_inputs->value, usid->value);
    23812380          bmap = createMaps("status");
    23822381          bmap->content=createMap("usid",usid->value);
     
    23852384         
    23862385          // Create PID file referencing the OS process identifier
    2387           fbkpid =
    2388             (char *)
    2389             malloc ((strlen (r_inputs->value) +
    2390                      strlen (usid->value) + 7) * sizeof (char));
    2391           sprintf (fbkpid, "%s/%s.pid", r_inputs->value, usid->value);
     2386          fbkpid =
     2387            (char *)
     2388            malloc ((strlen (r_inputs->value) +
     2389                     strlen (usid->value) + 7) * sizeof (char));
     2390          sprintf (fbkpid, "%s/%s.pid", r_inputs->value, usid->value);
    23922391          setMapInMaps (m, "lenv", "file.pid", fbkpid);
    23932392
    2394           f0 = freopen (fbkpid, "w+",stdout);
     2393          f0 = freopen (fbkpid, "w+",stdout);
    23952394          printf("%d",getpid());
    23962395          fflush(stdout);
    23972396
    23982397          // Create SID file referencing the semaphore name
    2399           fbkp =
    2400             (char *)
    2401             malloc ((strlen (r_inputs->value) + strlen (r_inputs1->value) +
    2402                      strlen (usid->value) + 7) * sizeof (char));
    2403           sprintf (fbkp, "%s/%s.sid", r_inputs->value, usid->value);
     2398          fbkp =
     2399            (char *)
     2400            malloc ((strlen (r_inputs->value) + strlen (r_inputs1->value) +
     2401                     strlen (usid->value) + 7) * sizeof (char));
     2402          sprintf (fbkp, "%s/%s.sid", r_inputs->value, usid->value);
    24042403          setMapInMaps (m, "lenv", "file.sid", fbkp);
    2405           FILE* f2 = freopen (fbkp, "w+",stdout);
     2404          FILE* f2 = freopen (fbkp, "w+",stdout);
    24062405          printf("%s",tmpm->value);
    24072406          fflush(f2);
    24082407          free(fbkp);
    24092408
    2410           fbkp =
    2411             (char *)
    2412             malloc ((strlen (r_inputs->value) + strlen (r_inputs1->value) +
    2413                      strlen (usid->value) + 7) * sizeof (char));
    2414           sprintf (fbkp, "%s/%s_%s.xml", r_inputs->value, r_inputs1->value,
    2415                    usid->value);
     2409          fbkp =
     2410            (char *)
     2411            malloc ((strlen (r_inputs->value) + strlen (r_inputs1->value) +
     2412                     strlen (usid->value) + 7) * sizeof (char));
     2413          sprintf (fbkp, "%s/%s_%s.xml", r_inputs->value, r_inputs1->value,
     2414                   usid->value);
    24162415          setMapInMaps (m, "lenv", "file.responseInit", fbkp);
    2417           flog =
    2418             (char *)
    2419             malloc ((strlen (r_inputs->value) + strlen (r_inputs1->value) +
    2420                      strlen (usid->value) + 13) * sizeof (char));
    2421           sprintf (flog, "%s/%s_%s_error.log", r_inputs->value,
    2422                    r_inputs1->value, usid->value);
     2416          flog =
     2417            (char *)
     2418            malloc ((strlen (r_inputs->value) + strlen (r_inputs1->value) +
     2419                     strlen (usid->value) + 13) * sizeof (char));
     2420          sprintf (flog, "%s/%s_%s_error.log", r_inputs->value,
     2421                   r_inputs1->value, usid->value);
    24232422          setMapInMaps (m, "lenv", "file.log", flog);
    24242423#ifdef DEBUG
    2425           fprintf (stderr, "RUN IN BACKGROUND MODE \n");
    2426           fprintf (stderr, "son pid continue (origin %d) %d ...\n", cpid,
    2427                    getpid ());
    2428           fprintf (stderr, "\nFILE TO STORE DATA %s\n", r_inputs->value);
    2429 #endif
    2430           freopen (flog, "w+", stderr);
    2431           fflush (stderr);
     2424          fprintf (stderr, "RUN IN BACKGROUND MODE \n");
     2425          fprintf (stderr, "son pid continue (origin %d) %d ...\n", cpid,
     2426                   getpid ());
     2427          fprintf (stderr, "\nFILE TO STORE DATA %s\n", r_inputs->value);
     2428#endif
     2429          freopen (flog, "w+", stderr);
     2430          fflush (stderr);
    24322431          f0 = freopen (fbkp, "w+", stdout);
    24332432          rewind (stdout);
     
    24392438          recordServiceStatus(m);
    24402439#endif
    2441           fprintf(stderr,"************************* %s %d \n\n",__FILE__,__LINE__);
    24422440          invokeCallback(m,NULL,NULL,0,0);
    2443           fprintf(stderr,"************************* %s %d \n\n",__FILE__,__LINE__);
    24442441          if(vid==0){
    2445             /**
    2446              * set status to SERVICE_STARTED and flush stdout to ensure full
    2447              * content was outputed (the file used to store the ResponseDocument).
    2448              * The rewind stdout to restart writing from the bgining of the file,
    2449              * this way the data will be updated at the end of the process run.
    2450              */
     2442            //
     2443            // set status to SERVICE_STARTED and flush stdout to ensure full
     2444            // content was outputed (the file used to store the ResponseDocument).
     2445            // Then, rewind stdout to restart writing from the begining of the file.
     2446            // This way, the data will be updated at the end of the process run.
     2447            //
    24512448            printProcessResponse (m, request_inputs, cpid, s1, r_inputs1->value,
    24522449                                  SERVICE_STARTED, request_input_real_format,
     
    24582455          }
    24592456
    2460           fflush (stderr);
    2461 
    2462           fbkp1 =
    2463             (char *)
    2464             malloc ((strlen (r_inputs->value) + strlen (r_inputs1->value) +
    2465                      strlen (usid->value) + 13) * sizeof (char));
    2466           sprintf (fbkp1, "%s/%s_final_%s.xml", r_inputs->value,
    2467                    r_inputs1->value, usid->value);
     2457          fflush (stderr);
     2458
     2459          fbkp1 =
     2460            (char *)
     2461            malloc ((strlen (r_inputs->value) + strlen (r_inputs1->value) +
     2462                     strlen (usid->value) + 13) * sizeof (char));
     2463          sprintf (fbkp1, "%s/%s_final_%s.xml", r_inputs->value,
     2464                   r_inputs1->value, usid->value);
    24682465          setMapInMaps (m, "lenv", "file.responseFinal", fbkp1);
    24692466
    2470           f1 = freopen (fbkp1, "w+", stdout);
     2467          f1 = freopen (fbkp1, "w+", stdout);
    24712468
    24722469          map* serviceTypeMap=getMap(s1->content,"serviceType");
     
    24742471            setMapInMaps (m, "lenv", "serviceType", serviceTypeMap->value);
    24752472
    2476           char *flenv =
    2477             (char *)
    2478             malloc ((strlen (r_inputs->value) +
    2479                      strlen (usid->value) + 12) * sizeof (char));
    2480           sprintf (flenv, "%s/%s_lenv.cfg", r_inputs->value, usid->value);
     2473          char *flenv =
     2474            (char *)
     2475            malloc ((strlen (r_inputs->value) +
     2476                     strlen (usid->value) + 12) * sizeof (char));
     2477          sprintf (flenv, "%s/%s_lenv.cfg", r_inputs->value, usid->value);
    24812478          maps* lenvMaps=getMaps(m,"lenv");
    24822479          dumpMapsToFile(lenvMaps,flenv,0);
    24832480          free(flenv);
    24842481
    2485           fprintf(stderr,"************************* %s %d \n\n",__FILE__,__LINE__);
    24862482          invokeCallback(m,request_input_real_format,NULL,1,0);
    2487           fprintf(stderr,"************************* %s %d \n\n",__FILE__,__LINE__);
    2488           //dumpMaps(request_output_real_format);
    24892483          if(validateRequest(&m,s1,request_inputs, &request_input_real_format,&request_output_real_format,&hInternet)<0){
    24902484            freeService (&s1);
     
    24962490            if(dumpBackFinalFile(m,fbkp,fbkp1)<0)
    24972491              return -1;
    2498             //dumpBackFinalFile(m,fbkp,fbkp1);
    24992492#ifndef RELY_ON_DB
    25002493            dumpMapsToFile(bmap,fbkpres,1);
     
    25022495#else
    25032496            recordResponse(m,fbkp1);
    2504             fprintf(stderr,"************************* %s %d \n\n",__FILE__,__LINE__);
    25052497            invokeCallback(m,NULL,NULL,7,0);
    2506             fprintf(stderr,"************************* %s %d \n\n",__FILE__,__LINE__);
    25072498#endif
    25082499            unlink (fbkpid);
     
    25122503            cleanupCallbackThreads();
    25132504            close_sql(m,1);
    2514             //end_sql();
    25152505#endif
    25162506            close_sql(m,0);
     
    25282518            return -1;
    25292519          }
    2530           if(getMapFromMaps(m,"lenv","mapError")!=NULL){
    2531                 setMapInMaps(m,"lenv","message",_("Issue with geographic data"));
    2532                 invokeCallback(m,NULL,NULL,7,0);
    2533                 eres=-1;//SERVICE_FAILED;
     2520          if(getMapFromMaps(m,"lenv","mapError")!=NULL){
     2521            setMapInMaps(m,"lenv","message",_("Issue with geographic data"));
     2522            invokeCallback(m,NULL,NULL,7,0);
     2523            eres=-1;//SERVICE_FAILED;
    25342524          }else{
    2535             setMapInMaps(m,"lenv","ds_nb","0");
    2536             close_sql(m,0);
    25372525            loadServiceAndRun (&m, s1, request_inputs,
    25382526                               &request_input_real_format,
    25392527                               &request_output_real_format, &eres);
    2540             setMapInMaps(m,"lenv","ds_nb","2");
    25412528          }
    2542         }
     2529        }
    25432530      else
    25442531        {
     
    25472534           * error response here !!!
    25482535           */
    2549           eres = -1;
    2550           errorException (m, _("Unable to run the child process properly"),
    2551                           "InternalError", NULL);
     2536          eres = -1;
     2537          errorException (m, _("Unable to run the child process properly"),
     2538                          "InternalError", NULL);
    25522539        }
    25532540    }
     
    26072594        setMapInMaps(m,"lenv","fstate",wpsStatus[0]);
    26082595        break;
    2609       }
     2596      }     
    26102597#ifndef RELY_ON_DB
    26112598      dumpMapsToFile(bmap,fbkpres,1);
     
    26312618      free(fbkpres);
    26322619      free (fbkp1);
    2633       // free (tmps1); // tmps1 is stack memory and should not be freed
    26342620      if(cgiSid!=NULL)
    26352621        free(cgiSid);
     
    26442630    //InternetCloseHandle (&hInternet); 
    26452631#ifdef META_DB
    2646     //close_sql(m,0);
     2632    close_sql(m,0);
    26472633#endif
    26482634  }
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