summaryrefslogtreecommitdiffstats
path: root/bindings/lang_php5_helpers/wrapper_source_top.c
diff options
context:
space:
mode:
Diffstat (limited to 'bindings/lang_php5_helpers/wrapper_source_top.c')
-rw-r--r--bindings/lang_php5_helpers/wrapper_source_top.c248
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);
+}
+