diff options
Diffstat (limited to 'ext/satellite/class.c')
-rw-r--r-- | ext/satellite/class.c | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/ext/satellite/class.c b/ext/satellite/class.c new file mode 100644 index 0000000000..2ad1332909 --- /dev/null +++ b/ext/satellite/class.c @@ -0,0 +1,180 @@ +/* + +----------------------------------------------------------------------+ + | PHP version 4.0 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997, 1998, 1999, 2000 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 2.02 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available at through the world-wide-web at | + | http://www.php.net/license/2_02.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Author: David Eriksson <eriksson@php.net> | + +----------------------------------------------------------------------+ + */ + +/* + * $Id$ + * vim: syntax=c tabstop=2 shiftwidth=2 + */ + + +/* + * Helper function for making PHP classes + */ + +#include <php.h> +#include "common.h" +#include "class.h" + +void orbit_class_function_call( + zend_class_entry * pClass, + int dataType, + zend_property_reference *pPropertyReference, + Class_Constructor pConstructor, + Class_CallFunction pCallFunction, + INTERNAL_FUNCTION_PARAMETERS) +{ + /* get object */ + zval * object = pPropertyReference->object; + + /* get function name */ + zend_overloaded_element * function_name = + (zend_overloaded_element *)pPropertyReference->elements_list->tail->data; + + /* handle parameters */ + zval ** arguments = orbit_new_n(zval *, ZEND_NUM_ARGS()); + /*(zval **)emalloc(sizeof(zval *) * ZEND_NUM_ARGS());*/ + if (getParametersArray(ht, ZEND_NUM_ARGS(), arguments) == FAILURE) + { + /* TODO: handle error */ + } + + /* constructor or normal function? */ + if (zend_llist_count(pPropertyReference->elements_list) == 1 + && !strcasecmp(function_name->element.value.str.val, pClass->name)) + { + /* constructor */ + if (pConstructor) + { + void * p_data = NULL; + zend_bool success = (*pConstructor)(&p_data, ZEND_NUM_ARGS(), arguments); + + if (success) + orbit_save_data(object, dataType, p_data); + } + else + { + zend_error(E_ERROR, "(Satellite) This class has no constructor");\ + } + } + else + { + /* normal function */ + if (pCallFunction) + { + void * p_data = orbit_retrieve_data(object, dataType); + + if (p_data == NULL) + { + /* + * this means that the constructor has failed earlier! + * -- or should NULL be allowed here? + */ + php_error(E_ERROR, "(Satellite) Class has no data!"); + RETVAL_NULL(); + goto orbit_class_function_call_exit; + } + + /* pval * return_value is a part of INTERNAL_FUNCTION_PARAMETERS */ + (*pCallFunction)(p_data, function_name->element.value.str.val, + ZEND_NUM_ARGS(), arguments, return_value); + } + else + { + zend_error(E_ERROR, "(Satellite) Can't call functions in this class");\ + } + } + +orbit_class_function_call_exit: + satellite_delete(arguments); + + /* seems to be required! */ + zval_dtor(&function_name->element); +} + +/* + * save a corba object to a php object + */ +void orbit_save_data(zval * php_object, int type, void * data) +{ + pval * orbit_data_handle = NULL; + long id = zend_list_insert( + data, /* data */ + type /* type */ + ); + + + /* + * do it like they do in php_COM_call_function_handler + * (insert into some magic hash index) + */ + ALLOC_ZVAL(orbit_data_handle); /* allocate memory for value */ + + orbit_data_handle->type = IS_LONG; + orbit_data_handle->value.lval = id; + + pval_copy_constructor(orbit_data_handle); /* why? */ + + INIT_PZVAL(orbit_data_handle); /* set reference count */ + + zend_hash_index_update( + php_object->value.obj.properties, /* hashtable */ + 0, /* hash??? */ + &orbit_data_handle, /* data */ + sizeof(pval *), /* data size */ + NULL /* destination */ + ); +} + +/* + * retrieve a corba object from a php object + */ +void * orbit_retrieve_data(const zval * php_object, int wanted_type) +{ + void * data = NULL; + pval ** orbit_data_handle = NULL; + int type = 0; + + /* get handle to corba data */ + zend_hash_index_find( + php_object->value.obj.properties, /* hash table */ + 0, /* hash??? */ + (void **)&orbit_data_handle /* data */ + ); + + if (orbit_data_handle == NULL || *orbit_data_handle == NULL) + { + return NULL; + } + + /* get corba data */ + data = zend_list_find( + (*orbit_data_handle)->value.lval, /* id */ + &type /* type */ + ); + + /* verify corba object */ + if (!data || (type != wanted_type)) + { + /* TODO: handle error */ + return NULL; + } + + return data; +} + + |