summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2008-12-05 22:55:15 +0100
committerMarcel Holtmann <marcel@holtmann.org>2008-12-05 22:55:15 +0100
commit193dcee5019657796339e4c4132e6d5425318871 (patch)
treea138f701b385f07657d689cabe2ff92c30da38b3 /src
parent00762852ce32ff3c639241cb247290a1a5c76007 (diff)
downloadconnman-193dcee5019657796339e4c4132e6d5425318871.tar.gz
connman-193dcee5019657796339e4c4132e6d5425318871.tar.bz2
connman-193dcee5019657796339e4c4132e6d5425318871.zip
Support selected listing and counting of elements
Diffstat (limited to 'src')
-rw-r--r--src/connman.h8
-rw-r--r--src/element.c45
-rw-r--r--src/manager.c6
3 files changed, 41 insertions, 18 deletions
diff --git a/src/connman.h b/src/connman.h
index 9f7c4c1f..965a2839 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -73,9 +73,11 @@ void __connman_driver_rescan(struct connman_driver *driver);
int __connman_element_init(DBusConnection *conn, const char *device);
void __connman_element_cleanup(void);
-void __connman_element_list(enum connman_element_type type,
- DBusMessageIter *iter);
-int __connman_element_count(enum connman_element_type type);
+void __connman_element_list(struct connman_element *element,
+ enum connman_element_type type,
+ DBusMessageIter *iter);
+int __connman_element_count(struct connman_element *element,
+ enum connman_element_type type);
const char *__connman_element_type2string(enum connman_element_type type);
const char *__connman_element_subtype2string(enum connman_element_subtype type);
diff --git a/src/element.c b/src/element.c
index 0f7ceccb..0aef003b 100644
--- a/src/element.c
+++ b/src/element.c
@@ -356,7 +356,8 @@ static DBusMessage *do_disable(DBusConnection *conn,
return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
}
-static void append_networks(DBusMessageIter *dict)
+static void append_networks(struct connman_element *element,
+ DBusMessageIter *dict)
{
DBusMessageIter entry, value, iter;
const char *key = "Networks";
@@ -373,7 +374,7 @@ static void append_networks(DBusMessageIter *dict)
dbus_message_iter_open_container(&value, DBUS_TYPE_ARRAY,
DBUS_TYPE_OBJECT_PATH_AS_STRING, &iter);
- __connman_element_list(CONNMAN_ELEMENT_TYPE_NETWORK, &iter);
+ __connman_element_list(element, CONNMAN_ELEMENT_TYPE_NETWORK, &iter);
dbus_message_iter_close_container(&value, &iter);
@@ -416,7 +417,7 @@ static DBusMessage *get_device_properties(DBusConnection *conn,
connman_dbus_dict_append_variant(&dict, "Powered",
DBUS_TYPE_BOOLEAN, &element->enabled);
- append_networks(&dict);
+ append_networks(element, &dict);
add_common_properties(element, &dict);
@@ -735,16 +736,26 @@ static gboolean append_path(GNode *node, gpointer user_data)
return FALSE;
}
-void __connman_element_list(enum connman_element_type type,
- DBusMessageIter *iter)
+void __connman_element_list(struct connman_element *element,
+ enum connman_element_type type,
+ DBusMessageIter *iter)
{
struct append_filter filter = { type, iter };
+ 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_static_rw_lock_reader_lock(&element_lock);
- g_node_traverse(element_root, G_PRE_ORDER, G_TRAVERSE_ALL, -1,
- append_path, &filter);
+ g_node_traverse(node, G_PRE_ORDER, G_TRAVERSE_ALL, -1,
+ append_path, &filter);
g_static_rw_lock_reader_unlock(&element_lock);
}
@@ -772,15 +783,25 @@ static gboolean count_element(GNode *node, gpointer user_data)
return FALSE;
}
-int __connman_element_count(enum connman_element_type type)
+int __connman_element_count(struct connman_element *element,
+ enum connman_element_type type)
{
struct count_data data = { type, 0 };
+ GNode *node;
DBG("");
+ if (element != NULL) {
+ node = g_node_find(element_root, G_PRE_ORDER,
+ G_TRAVERSE_ALL, element);
+ if (node == NULL)
+ return 0;
+ } else
+ node = element_root;
+
g_static_rw_lock_reader_lock(&element_lock);
- g_node_traverse(element_root, G_PRE_ORDER, G_TRAVERSE_ALL, -1,
- count_element, &data);
+ g_node_traverse(node, G_PRE_ORDER, G_TRAVERSE_ALL, -1,
+ count_element, &data);
g_static_rw_lock_reader_unlock(&element_lock);
return data.count;
@@ -1506,7 +1527,7 @@ static void append_devices(DBusMessageIter *entry)
dbus_message_iter_open_container(&value, DBUS_TYPE_ARRAY,
DBUS_TYPE_OBJECT_PATH_AS_STRING, &iter);
- __connman_element_list(CONNMAN_ELEMENT_TYPE_DEVICE, &iter);
+ __connman_element_list(NULL, CONNMAN_ELEMENT_TYPE_DEVICE, &iter);
dbus_message_iter_close_container(&value, &iter);
@@ -1546,7 +1567,7 @@ static void append_connections(DBusMessageIter *entry)
dbus_message_iter_open_container(&value, DBUS_TYPE_ARRAY,
DBUS_TYPE_OBJECT_PATH_AS_STRING, &iter);
- __connman_element_list(CONNMAN_ELEMENT_TYPE_CONNECTION, &iter);
+ __connman_element_list(NULL, CONNMAN_ELEMENT_TYPE_CONNECTION, &iter);
dbus_message_iter_close_container(&value, &iter);
diff --git a/src/manager.c b/src/manager.c
index 341e4623..3c22339c 100644
--- a/src/manager.c
+++ b/src/manager.c
@@ -70,7 +70,7 @@ static void append_devices(DBusMessageIter *dict)
dbus_message_iter_open_container(&value, DBUS_TYPE_ARRAY,
DBUS_TYPE_OBJECT_PATH_AS_STRING, &iter);
- __connman_element_list(CONNMAN_ELEMENT_TYPE_DEVICE, &iter);
+ __connman_element_list(NULL, CONNMAN_ELEMENT_TYPE_DEVICE, &iter);
dbus_message_iter_close_container(&value, &iter);
@@ -96,7 +96,7 @@ static void append_connections(DBusMessageIter *dict)
dbus_message_iter_open_container(&value, DBUS_TYPE_ARRAY,
DBUS_TYPE_OBJECT_PATH_AS_STRING, &iter);
- __connman_element_list(CONNMAN_ELEMENT_TYPE_CONNECTION, &iter);
+ __connman_element_list(NULL, CONNMAN_ELEMENT_TYPE_CONNECTION, &iter);
dbus_message_iter_close_container(&value, &iter);
@@ -149,7 +149,7 @@ static DBusMessage *get_properties(DBusConnection *conn,
append_devices(&dict);
append_connections(&dict);
- if (__connman_element_count(CONNMAN_ELEMENT_TYPE_CONNECTION) > 0)
+ if (__connman_element_count(NULL, CONNMAN_ELEMENT_TYPE_CONNECTION) > 0)
append_state(&dict, "online");
else
append_state(&dict, "offline");