Add generic element iteration function
authorMarcel Holtmann <marcel@holtmann.org>
Fri, 2 Jan 2009 21:07:17 +0000 (22:07 +0100)
committerMarcel Holtmann <marcel@holtmann.org>
Fri, 2 Jan 2009 21:07:17 +0000 (22:07 +0100)
src/connman.h
src/element.c

index 25f5085..78fc430 100644 (file)
@@ -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);
index e82337d..31eb9a5 100644 (file)
@@ -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;