diff options
Diffstat (limited to 'bindings/lang_php5_helpers/wrapper_source_top.c')
-rw-r--r-- | bindings/lang_php5_helpers/wrapper_source_top.c | 248 |
1 files changed, 167 insertions, 81 deletions
diff --git a/bindings/lang_php5_helpers/wrapper_source_top.c b/bindings/lang_php5_helpers/wrapper_source_top.c index b293cecb..9181f3c0 100644 --- a/bindings/lang_php5_helpers/wrapper_source_top.c +++ b/bindings/lang_php5_helpers/wrapper_source_top.c @@ -7,15 +7,82 @@ #include <lasso/lasso.h> #include "php_lasso.h" +/* utility functions */ + +#if (GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION < 14) + /* copy of private struct and g_hash_table_get_keys from GLib internals + * (as this function is useful but new in 2.14) */ + +typedef struct _GHashNode GHashNode; + +struct _GHashNode +{ + gpointer key; + gpointer value; + GHashNode *next; + guint key_hash; +}; + +struct _GHashTable +{ + gint size; + gint nnodes; + GHashNode **nodes; + GHashFunc hash_func; + GEqualFunc key_equal_func; + volatile gint ref_count; + GDestroyNotify key_destroy_func; + GDestroyNotify value_destroy_func; +}; + +static GList * +g_hash_table_get_keys (GHashTable *hash_table) +{ + GHashNode *node; + gint i; + GList *retval; + + g_return_val_if_fail (hash_table != NULL, NULL); + + retval = NULL; + for (i = 0; i < hash_table->size; i++) + for (node = hash_table->nodes[i]; node; node = node->next) + retval = g_list_prepend (retval, node->key); + + return retval; +} + +#endif + +/* Define the Lasso PHP module */ + int le_lasso_server; ZEND_GET_MODULE(lasso) +/* Wrapper around GObject to get the dynamic typename */ + typedef struct { GObject *obj; char *typename; } PhpGObjectPtr; +static PhpGObjectPtr* +PhpGObjectPtr_New(GObject *obj) +{ + PhpGObjectPtr *self; + + if (obj == NULL) { + return NULL; + } + + self = (PhpGObjectPtr *)emalloc(sizeof(PhpGObjectPtr)); + self->obj = obj; + self->typename = estrdup(G_OBJECT_TYPE_NAME(obj)); + + return self; +} + PHP_FUNCTION(lasso_get_object_typename) { PhpGObjectPtr *self; @@ -29,6 +96,8 @@ PHP_FUNCTION(lasso_get_object_typename) RETURN_STRING(self->typename, 1); } +/* Conversion functions */ + static char* get_string_from_xml_node(xmlNode *xmlnode) { @@ -96,89 +165,30 @@ get_list_from_array_of_strings(zval* array) return result; } -/* utility functions */ - -#if (GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION < 14) - /* copy of private struct and g_hash_table_get_keys from GLib internals - * (as this function is useful but new in 2.14) */ - -typedef struct _GHashNode GHashNode; - -struct _GHashNode -{ - gpointer key; - gpointer value; - GHashNode *next; - guint key_hash; -}; - -struct _GHashTable -{ - gint size; - gint nnodes; - GHashNode **nodes; - GHashFunc hash_func; - GEqualFunc key_equal_func; - volatile gint ref_count; - GDestroyNotify key_destroy_func; - GDestroyNotify value_destroy_func; -}; - -GList * -g_hash_table_get_keys (GHashTable *hash_table) -{ - GHashNode *node; - gint i; - GList *retval; - - g_return_val_if_fail (hash_table != NULL, NULL); - - retval = NULL; - for (i = 0; i < hash_table->size; i++) - for (node = hash_table->nodes[i]; node; node = node->next) - retval = g_list_prepend (retval, node->key); - - return retval; -} - -#endif - static void -set_array_from_hashtable_of_objects(GHashTable *value, zval **array) -{ - GList *keys; - GObject *item_value; - PhpGObjectPtr *tmp_item; - zval *item; +set_array_from_list_of_strings(GList* list, zval **array) { + GList* item; array_init(*array); - for (keys = g_hash_table_get_keys(value); keys; keys = g_list_next(keys)) { - item_value = g_hash_table_lookup(value, keys->data); - if (item_value) { - tmp_item = (PhpGObjectPtr *)emalloc(sizeof(PhpGObjectPtr)); - tmp_item->obj = G_OBJECT(item_value); - tmp_item->typename = estrdup(G_OBJECT_TYPE_NAME(G_OBJECT(item_value))); - ZEND_REGISTER_RESOURCE(item, tmp_item, le_lasso_server); - add_assoc_zval(*array, (char*)keys->data, item); + for (item = g_list_first(list); item != NULL; item = g_list_next(item)) { + if (item->data != NULL) { + add_next_index_string(*array, item->data, 1); } else { - add_assoc_null(*array, (char*)keys->data); + add_next_index_null(*array); } } - g_list_free(keys); } -static GHashTable* -get_hashtable_from_array_of_strings(zval* array) +static GList* +get_list_from_array_of_xmlnodes(zval* array) { HashTable* hashtable; HashPosition pointer; int size; - char *key; - unsigned int key_len; - unsigned long index; zval** data; zval temp; - GHashTable* result = NULL; + char *temp_str; + GList* result = NULL; hashtable = Z_ARRVAL_P(array); size = zend_hash_num_elements(hashtable); @@ -188,27 +198,82 @@ get_hashtable_from_array_of_strings(zval* array) temp = **data; zval_copy_ctor(&temp); convert_to_string(&temp); - if (zend_hash_get_current_key_ex(hashtable, &key, &key_len, &index, 0, &pointer) == HASH_KEY_IS_STRING) { - g_hash_table_insert(result, key, estrndup(Z_STRVAL(temp), Z_STRLEN(temp))); + temp_str = estrndup(Z_STRVAL(temp), Z_STRLEN(temp)); + result = g_list_append(result, get_xml_node_from_string(temp_str)); + zval_dtor(&temp); + } + return result; +} + +static void +set_array_from_list_of_xmlnodes(GList* list, zval **array) { + GList* item; + + array_init(*array); + for (item = g_list_first(list); item != NULL; item = g_list_next(item)) { + if (item->data != NULL) { + add_next_index_string(*array, get_string_from_xml_node(item->data), 1); } else { - g_hash_table_insert(result, (void*)index, estrndup(Z_STRVAL(temp), Z_STRLEN(temp))); + add_next_index_null(*array); + } + } +} + +static GList* +get_list_from_array_of_objects(zval *array) +{ + HashTable *hashtable; + HashPosition pointer; + int size; + zval **data; + PhpGObjectPtr *cvt_temp; + GList *result = NULL; + + hashtable = Z_ARRVAL_P(array); + size = zend_hash_num_elements(hashtable); + for (zend_hash_internal_pointer_reset_ex(hashtable, &pointer); + zend_hash_get_current_data_ex(hashtable, (void**) &data, &pointer) == SUCCESS; + zend_hash_move_forward_ex(hashtable, &pointer)) { + cvt_temp = (PhpGObjectPtr*) zend_fetch_resource(data TSRMLS_CC, -1, PHP_LASSO_SERVER_RES_NAME, NULL, 1, le_lasso_server); + if (cvt_temp != NULL) { + result = g_list_append(result, cvt_temp->obj); + } else { + result = g_list_append(result, NULL); } - zval_dtor(&temp); } return result; } +static void +set_array_from_list_of_objects(GList *list, zval **array) +{ + GList *item = NULL; + zval *zval_item = NULL; + + array_init(*array); + for (item = g_list_first(list); item != NULL; item = g_list_next(item)) { + if (item->data != NULL) { + zval_item = emalloc(sizeof(PhpGObjectPtr)); + ZEND_REGISTER_RESOURCE(zval_item, PhpGObjectPtr_New(item->data), le_lasso_server); + add_next_index_zval(*array, zval_item); + } else { + add_next_index_null(*array); + } + } +} + +/* FIXME: This function doesn't work yet */ static GHashTable* get_hashtable_from_array_of_objects(zval *array) { - HashTable *hashtable; + HashTable *hashtable = NULL; HashPosition pointer; int size; - char *key; + char *key = NULL; unsigned int key_len; unsigned long index; - zval **data; - PhpGObjectPtr *cvt_temp; + zval **data = NULL; + PhpGObjectPtr *cvt_temp = NULL; GHashTable *result = NULL; result = g_hash_table_new(g_str_hash, g_str_equal); @@ -220,18 +285,39 @@ get_hashtable_from_array_of_objects(zval *array) cvt_temp = (PhpGObjectPtr*) zend_fetch_resource(data TSRMLS_CC, -1, PHP_LASSO_SERVER_RES_NAME, NULL, 1, le_lasso_server); if (zend_hash_get_current_key_ex(hashtable, &key, &key_len, &index, 0, &pointer) == HASH_KEY_IS_STRING) { if (cvt_temp != NULL) { - g_hash_table_insert(result, key, cvt_temp->obj); + g_hash_table_insert(result, key, g_object_ref(cvt_temp->obj)); } else { g_hash_table_insert(result, key, NULL); - } + } } else { if (cvt_temp != NULL) { - g_hash_table_insert(result, (gpointer)index, cvt_temp->obj); + g_hash_table_insert(result, (gpointer)index, g_object_ref(cvt_temp->obj)); } else { g_hash_table_insert(result, (gpointer)index, NULL); - } + } } } return result; } +static void +set_array_from_hashtable_of_objects(GHashTable *hashtable, zval **array) +{ + GList *keys = NULL; + GObject *item = NULL; + zval *zval_item = NULL; + + array_init(*array); + for (keys = g_hash_table_get_keys(hashtable); keys; keys = g_list_next(keys)) { + item = g_hash_table_lookup(hashtable, keys->data); + if (item) { + zval_item = emalloc(sizeof(PhpGObjectPtr)); + ZEND_REGISTER_RESOURCE(zval_item, PhpGObjectPtr_New(item), le_lasso_server); + add_assoc_zval(*array, (char*)keys->data, zval_item); + } else { + add_assoc_null(*array, (char*)keys->data); + } + } + g_list_free(keys); +} + |