From 109c78bb7a0e8dd9decf1ee234d76b56a4a062d3 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Fri, 2 Jan 2009 22:07:17 +0100 Subject: [PATCH] Add generic element iteration function --- src/connman.h | 5 +++++ src/element.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/src/connman.h b/src/connman.h index 25f5085..78fc430 100644 --- a/src/connman.h +++ b/src/connman.h @@ -90,6 +90,11 @@ void __connman_element_start(void); void __connman_element_stop(void); void __connman_element_cleanup(void); +typedef void (* element_cb_t) (struct connman_element *element, void *user_data); + +void __connman_element_foreach(struct connman_element *element, + enum connman_element_type type, + element_cb_t callback, gpointer user_data); void __connman_element_list(struct connman_element *element, enum connman_element_type type, DBusMessageIter *iter); diff --git a/src/element.c b/src/element.c index e82337d..31eb9a5 100644 --- a/src/element.c +++ b/src/element.c @@ -610,6 +610,53 @@ static GDBusSignalTable element_signals[] = { { }, }; +struct foreach_data { + enum connman_element_type type; + element_cb_t callback; + gpointer user_data; +}; + +static gboolean foreach_callback(GNode *node, gpointer user_data) +{ + struct connman_element *element = node->data; + struct foreach_data *data = user_data; + + DBG("element %p name %s", element, element->name); + + if (element->type == CONNMAN_ELEMENT_TYPE_ROOT) + return FALSE; + + if (data->type != CONNMAN_ELEMENT_TYPE_UNKNOWN && + data->type != element->type) + return FALSE; + + if (data->callback) + data->callback(element, data->user_data); + + return FALSE; +} + +void __connman_element_foreach(struct connman_element *element, + enum connman_element_type type, + element_cb_t callback, gpointer user_data) +{ + struct foreach_data data = { type, callback, user_data }; + GNode *node; + + DBG(""); + + if (element != NULL) { + node = g_node_find(element_root, G_PRE_ORDER, + G_TRAVERSE_ALL, element); + if (node == NULL) + return; + } else + node = element_root; + + g_node_traverse(node, G_PRE_ORDER, G_TRAVERSE_ALL, -1, + foreach_callback, &data); +} + struct append_filter { enum connman_element_type type; DBusMessageIter *iter; -- 1.7.9.5