source: trunk/zoo-project/zoo-kernel/service_internal_php.c @ 508

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

Stop blowing the stack in ulinet. Add API function addToMapWithSize for assigning binary data to map. Add support for binary inputs/outputs for the PHP language.

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc
File size: 6.5 KB
Line 
1/**
2 * Author : Gérald FENOY
3 *
4 * Copyright (c) 2009-2010 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_php.h"
26
27#ifdef ZTS
28void ***tsrm_ls;
29#endif
30
31int zoo_php_support(maps** main_conf,map* request,service* s,maps **real_inputs,maps **real_outputs){
32  fprintf(stderr,"STARING PHP SCRIPT\n");
33  maps* m=*main_conf;
34  maps* inputs=*real_inputs;
35  maps* outputs=*real_outputs;
36  char ntmp[1024];
37  getcwd(ntmp,1024);
38  map* tmp=getMap(request,"metapath");
39
40  int res=SERVICE_FAILED;
41
42  tmp=getMap(s->content,"serviceProvider");
43  zend_file_handle iscript;
44  iscript.type=ZEND_HANDLE_FP;
45  iscript.filename=tmp->value;
46  iscript.opened_path=NULL;
47  //iscript.free_filname=0;
48  if(!(iscript.handle.fp=fopen(iscript.filename,"rb"))){
49    char tmp1[1024];
50    sprintf(tmp1,"Unable to load PHP file %s",tmp->value);
51    map* err=createMap("text",tmp1);
52    addToMap(err,"code","NoApplicableCode");
53    printExceptionReportResponse(m,err);
54    exit(-1);
55  }
56
57  php_embed_init(0,NULL,&tsrm_ls);
58 
59  zend_try {
60    php_execute_script(&iscript TSRMLS_CC);
61
62    zval *iargs[3];
63    zval iret, ifunc,ifile;
64     
65    ZVAL_STRING(&ifunc, s->name, 0);
66    iargs[0] = php_Array_from_maps(*main_conf);
67    iargs[1] = php_Array_from_maps(*real_inputs);
68    iargs[2] = php_Array_from_maps(*real_outputs);
69   
70    call_user_function(EG(function_table), NULL, &ifunc, &iret, 3, iargs TSRMLS_CC);
71
72    HashTable* t=HASH_OF(iargs[2]);
73    *real_outputs=php_maps_from_Array(t);
74   
75    char tmp1[1024];
76
77    res=SERVICE_SUCCEEDED;
78
79  } zend_catch { 
80    map* err=createMap("text","Unable to process.");
81    addToMap(err,"code","NoApplicableCode");
82    printExceptionReportResponse(m,err);
83    exit(-1);
84  } zend_end_try();
85
86  php_embed_shutdown(TSRMLS_C);
87
88  return res;
89}
90
91zval *php_Array_from_maps(maps* t){
92  zval *mapArray;
93  zval *mapArrayTmp;
94  maps* tmp=t;
95  int tres=0;
96  MAKE_STD_ZVAL(mapArray);
97  tres=array_init(mapArray);
98  while(tmp!=NULL){
99    add_assoc_zval(mapArray,tmp->name,php_Array_from_map(tmp->content));
100    tmp=tmp->next;
101  }
102  return mapArray;
103}
104
105zval *php_Array_from_map(map* t){
106  zval *mapArray;
107  zval *mapArrayTmp;
108  map* tmp=t;
109  int tres=0;
110  MAKE_STD_ZVAL(mapArray);
111  tres=array_init(mapArray);
112  while(tmp!=NULL){
113    map* sMap=getMapArray(tmp,"size",i);
114    if(strncmp(tmp->name,"value",5)==0 && sMap!=NULL){
115      tres=add_assoc_stringl(mapArray,tmp->name,tmp->value,atoi(sMap->value),1);
116    }else
117      tres=add_assoc_string(mapArray,tmp->name,tmp->value,1);
118    tmp=tmp->next;
119  }
120  return mapArray;
121}
122
123maps* php_maps_from_Array(HashTable *t){
124  maps* final_res=NULL;
125  maps* cursor=final_res;
126  char key[1024];
127  for(zend_hash_internal_pointer_reset(t); 
128      zend_hash_has_more_elements(t) == SUCCESS; 
129      zend_hash_move_forward(t)) { 
130    char *key; 
131    uint keylen; 
132    ulong idx; 
133    int type; 
134    zval **ppzval, tmpcopy; 
135    type = zend_hash_get_current_key_ex(t, &key, &keylen, &idx, 0, NULL); 
136    if (zend_hash_get_current_data(t, (void**)&ppzval) == FAILURE) { 
137      /**
138       * Should never actually fail since the key is known to exist.
139       */
140      continue; 
141    }
142    /**
143     * Duplicate the zval so that * the orignal’s contents are not destroyed
144     */
145    tmpcopy = **ppzval;
146#ifdef DEBUG
147    fprintf(stderr,"key : %s\n",key);
148#endif
149    zval_copy_ctor(&tmpcopy); 
150#ifdef DEBUG
151    fprintf(stderr,"key : %s\n",key);
152#endif
153    /**
154     * Reset refcount & Convert
155     */
156    INIT_PZVAL(&tmpcopy); 
157    //convert_to_string(&tmpcopy);
158    if (type == HASH_KEY_IS_STRING) { 
159      /**
160       * String Key / Associative
161       */
162      cursor=(maps*)malloc(MAPS_SIZE);
163      cursor->name=strdup(key);
164    }
165    fprintf(stderr,"key : %s\n",key);
166    HashTable* t=HASH_OF(*ppzval);
167#ifdef DEBUG
168    fprintf(stderr,"key : %s\n",key);
169#endif
170    cursor->content=php_map_from_HasTable(t);
171    cursor->next=NULL;
172    if(final_res==NULL)
173      final_res=cursor;
174    else
175      addMapsToMaps(&final_res,cursor);
176#ifdef DEBUG
177    fprintf(stderr,"key : %s\n",key);
178#endif
179    /**
180     * Toss out old copy
181     */
182    zval_dtor(&tmpcopy);
183  }
184  return final_res;
185}
186
187map* php_map_from_HasTable(HashTable* t){
188#ifdef DEBUG
189  fprintf(stderr,"mapsFromPHPArray start\n");
190#endif
191  map* final_res=(map*)malloc(MAP_SIZE);
192  final_res=NULL;
193  char key[1024];
194  for(zend_hash_internal_pointer_reset(t);
195      zend_hash_has_more_elements(t) == SUCCESS;
196      zend_hash_move_forward(t)) {
197    char *key;
198    uint keylen;
199    ulong idx;
200    int type;
201    int len;
202    zval **ppzval, tmpcopy;
203    type = zend_hash_get_current_key_ex(t, &key, &keylen, &idx, 0, NULL); 
204    if (zend_hash_get_current_data(t, (void**)&ppzval) == FAILURE) { 
205      /* Should never actually fail * since the key is known to exist. */ 
206      continue; 
207    }
208    /**
209     * Duplicate the zval so that * the orignal’s contents are not destroyed
210     */ 
211    tmpcopy = **ppzval; 
212    zval_copy_ctor(&tmpcopy); 
213    /**
214     * Reset refcount & Convert
215     */ 
216    INIT_PZVAL(&tmpcopy); 
217    convert_to_string(&tmpcopy);
218    if(strncmp(key,"value")==0){
219      len=Z_STRLEN_P(varcopy);
220      addToMapWithSize(final_res,key,Z_STRVAL_P(tmpcopy),len);
221    }
222    else{
223      if(final_res==NULL){
224#ifdef DEBUG
225        fprintf(stderr,"%s => %s\n",key,Z_STRVAL(tmpcopy));
226#endif
227        final_res=createMap(key,Z_STRVAL(tmpcopy));
228      }
229      else{
230#ifdef DEBUG
231        fprintf(stderr,"%s => %s\n",key,Z_STRVAL(tmpcopy));
232#endif
233        addToMap(&final_res,key,Z_STRVAL(tmpcopy));
234      }
235    }
236    /* Toss out old copy */ 
237    zval_dtor(&tmpcopy); 
238  }
239  return final_res;
240}
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