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

Last change on this file since 471 was 471, checked in by djay, 10 years ago

Remove leaks from DescribeProcess? and JavaScript? support. Fix wrong ulinet update on previous commit. Use the new updateStatus/setOutputValue functions as described in #88 from longProcess. Add default value for QREncode service in ZCFG. Fix name of profile service in the ZCFG file.

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