summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2009-01-02 22:07:17 +0100
committerMarcel Holtmann <marcel@holtmann.org>2009-01-02 22:07:17 +0100
commit109c78bb7a0e8dd9decf1ee234d76b56a4a062d3 (patch)
tree46c06bd6e0c489e2a00273dd09b9f7945b74a6bb
parent384763cf5951681441c1828ca20d3fc21d8553b3 (diff)
downloadconnman-109c78bb7a0e8dd9decf1ee234d76b56a4a062d3.tar.gz
connman-109c78bb7a0e8dd9decf1ee234d76b56a4a062d3.tar.bz2
connman-109c78bb7a0e8dd9decf1ee234d76b56a4a062d3.zip
Add generic element iteration function
-rw-r--r--src/connman.h5
-rw-r--r--src/element.c47
2 files changed, 52 insertions, 0 deletions
diff --git a/src/connman.h b/src/connman.h
index 25f50858..78fc4302 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 e82337d6..31eb9a5c 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;