source: trunk/zoo-project/zoo-services/utils/status/service.c @ 799

Last change on this file since 799 was 788, checked in by knut, 8 years ago

Implemented support for PHP 7: The Zend API for PHP 7/PHPNG is substantially different from older versions. Therefore, an alternative implementation of zoo_php_support is provided in the new source file service_internal_php7.c. Presently the Zoo kernel can be built with support for either PHP 7 or older versions, see the makefiles (for Windows) nmake.opt and makefile.vc. Other makefiles have not been updated.

Fixed problem with ambiguous symbol in service_conf.y. Fixed problem with conversion of line endings yielding extra bytes in _getStatusFile on Windows platforms. Removed call to free() stack memory in zoo_service_loader.c. Fixed issue with size of structs in service.h.

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc
File size: 5.2 KB
RevLine 
[26]1/**
2 * Author : Gérald FENOY
3 *
4 * Copyright 2008-2009 GeoLabs SARL. All rights reserved.
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 */
[34]24
[788]25
[26]26#include "service.h"
[384]27#include "service_internal.h"
[26]28
29#include <libxml/tree.h>
30#include <libxml/parser.h>
31#include <libxml/xpath.h>
32#include <libxml/xpathInternals.h>
33
34#include <libxslt/xslt.h>
35#include <libxslt/xsltInternals.h>
36#include <libxslt/transform.h>
37#include <libxslt/xsltutils.h>
38
39#include <dirent.h>
[777]40extern "C" {
[26]41
42  /**
43   * GetStatus ZOO Service :
44   * This service is used in the ZOO-Project to get information about Services
45   * running as background tasks. The service will first get the XML document
46   * cached by the ZOO-Kernel before calling effectively the Service, then
47   * will access the shared memory space created by the Kernel to extract the
48   * current status of the running Service. Using a simple XSL file it will
49   * finally produce the final ExecuteResponse including the updated
50   * percentCompleted attribute of the ProcessStarted node of the cached
51   * document if any (so if the Service is currently running) else it will
52   * return the final ExecuteResponse stored on the Server file system.
53   */
[712]54  ZOO_DLL_EXPORT int GetStatus(maps*& conf,maps*& inputs,maps*& outputs){         
[440]55    const char *params[4 + 1];
[26]56    int xmlLoadExtDtdDefaultValue;
57    map* tmpMap=NULL,*tmpMmap=NULL, *tmpTmap=NULL;
[440]58
[26]59    tmpMap=getMapFromMaps(inputs,"sid","value");
60    tmpTmap=getMapFromMaps(conf,"main","tmpPath");
61    tmpMmap=getMapFromMaps(conf,"main","dataPath");
[495]62    if(tmpMmap==NULL)
63      tmpMmap=tmpTmap;
[26]64    xmlInitParser();
[32]65    int hasFile=-1;
[652]66    char xslFileName[1024];
67    char* mem=_getStatusFile(conf,tmpMap->value);
68    if(mem==NULL){
[32]69      char tmp[1024];
[34]70      snprintf(tmp,1024,_ss("GetStatus was unable to find any cache file for Service ID %s."),tmpMap->value);
[32]71      setMapInMaps(conf,"lenv","message",tmp);
72      return SERVICE_FAILED;
73    }
[26]74    sprintf(xslFileName,"%s/updateStatus.xsl",tmpMmap->value);
75    xmlSubstituteEntitiesDefault(1);
76    xmlLoadExtDtdDefaultValue = 0;
77    xsltStylesheetPtr cur = NULL;
78    xmlDocPtr doc, res;
79    cur = xsltParseStylesheetFile(BAD_CAST xslFileName);
[652]80    doc = xmlParseMemory(mem,strlen(mem));
81    //doc = xmlParseFile(fileName);
[26]82    if(cur!=NULL && doc!=NULL){
[440]83      /**
84       * Parse Status to extract Status / Message
85       */
[652]86      char *tmpStr=_getStatus(conf,tmpMap->value);
[478]87#ifdef DEBUG
[471]88      fprintf(stderr,"DEBUG: %s \n",tmpStr);
[478]89#endif
[440]90      if(tmpStr!=NULL && strncmp(tmpStr,"-1",2)!=0){
91        char *tmpStr1=strdup(tmpStr);
92        char *tmpStr0=strdup(strstr(tmpStr,"|")+1);
[515]93        free(tmpStr);
[440]94        tmpStr1[strlen(tmpStr1)-strlen(tmpStr0)-1]='\0';
95        char *tmpStrFinal=(char*)malloc((strlen(tmpStr0)+11)*sizeof(char));
96        sprintf(tmpStrFinal,"string(\"%s\")",tmpStr0);
97        params[0]="value";
98        params[1]=tmpStr1;
99        params[2]="message";
100        params[3]=tmpStrFinal;
101        params[4]=NULL;
102        res = xsltApplyStylesheet(cur, doc, params);
103        xmlChar *xmlbuff;
104        int buffersize;
105        xmlDocDumpFormatMemory(res, &xmlbuff, &buffersize, 1);
106        setMapInMaps(outputs,"Result","value",(char*)xmlbuff);
107        xmlFree(xmlbuff);
108        free(tmpStr1);
109        free(tmpStr0);
110        free(tmpStrFinal);
111      }else{
112        xmlChar *xmlbuff;
113        int buffersize;
114        xmlDocDumpFormatMemory(doc, &xmlbuff, &buffersize, 1);
115        setMapInMaps(outputs,"Result","value",(char*)xmlbuff);
116        xmlFree(xmlbuff);
117      }
[26]118    }
[32]119    else{
[26]120      char tmp[1024];
[34]121      sprintf(tmp,_ss("ZOO GetStatus Service was unable to parse the cache xml file available for the Service ID %s."),tmpMap->value);
[26]122      setMapInMaps(conf,"lenv","message",tmp);
123      return SERVICE_FAILED;
124    }
125    return SERVICE_SUCCEEDED;
126  }
127
128
129  /**
130   * longProcess ZOO Service :
131   * Simple Service which just loop over 100 times then return a welcome message
132   * string, at each step the service will sleep for one second.
133   */
134#ifdef WIN32
135  __declspec(dllexport)
136#endif
137  int longProcess(maps*& conf,maps*& inputs,maps*& outputs){
138    int i=0;
139    while(i<100){
[440]140      char message[10];
141      sprintf(message,"Step %d",i);
[471]142      updateStatus(conf,i,message);
[216]143#ifndef WIN32
[26]144      sleep(1);
[216]145#else
146      Sleep(1000);
147#endif
[26]148      i+=5;
149    }
[643]150    setOutputValue(outputs,"Result",(char*)"\"Long process run successfully\"",-1);
[26]151    return SERVICE_SUCCEEDED;
152  }
153
154}
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