Fix retrieving network list
[connman] / src / element.c
index 2d8168d..2a6caf9 100644 (file)
@@ -313,6 +313,51 @@ static void set_common_property(struct connman_element *element,
        __connman_element_unlock(element);
 }
 
+static void emit_enabled_signal(DBusConnection *conn,
+                                       struct connman_element *element)
+{
+       DBusMessage *signal;
+       DBusMessageIter entry, value;
+       const char *iface, *key;
+
+       DBG("conn %p", conn);
+
+       if (element == NULL)
+               return;
+
+       switch (element->type) {
+       case CONNMAN_ELEMENT_TYPE_DEVICE:
+               iface = CONNMAN_DEVICE_INTERFACE;
+               key = "Powered";
+               break;
+       case CONNMAN_ELEMENT_TYPE_NETWORK:
+               iface = CONNMAN_NETWORK_INTERFACE;
+               key = "Connected";
+               break;
+       default:
+               return;
+       }
+
+       signal = dbus_message_new_signal(element->path,
+                                               iface, "PropertyChanged");
+       if (signal == NULL)
+               return;
+
+       dbus_message_iter_init_append(signal, &entry);
+
+       dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key);
+
+       dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT,
+                                       DBUS_TYPE_BOOLEAN_AS_STRING, &value);
+
+       dbus_message_iter_append_basic(&value, DBUS_TYPE_BOOLEAN,
+                                                       &element->enabled);
+
+       dbus_message_iter_close_container(&entry, &value);
+
+       g_dbus_send_message(conn, signal);
+}
+
 static DBusMessage *do_update(DBusConnection *conn,
                                        DBusMessage *msg, void *data)
 {
@@ -351,6 +396,8 @@ static DBusMessage *do_enable(DBusConnection *conn,
 
        element->enabled = TRUE;
 
+       emit_enabled_signal(connection, element);
+
 #if 0
        g_dbus_emit_signal(connection, CONNMAN_MANAGER_PATH,
                                CONNMAN_MANAGER_INTERFACE, "ElementUpdated",
@@ -379,6 +426,8 @@ static DBusMessage *do_disable(DBusConnection *conn,
 
        element->enabled = FALSE;
 
+       emit_enabled_signal(connection, element);
+
 #if 0
        g_dbus_emit_signal(connection, CONNMAN_MANAGER_PATH,
                                CONNMAN_MANAGER_INTERFACE, "ElementUpdated",
@@ -390,21 +439,18 @@ static DBusMessage *do_disable(DBusConnection *conn,
 }
 
 static void append_networks(struct connman_element *element,
-                                               DBusMessageIter *dict)
+                                               DBusMessageIter *entry)
 {
-       DBusMessageIter entry, value, iter;
+       DBusMessageIter value, iter;
        const char *key = "Networks";
 
        if (element->subtype != CONNMAN_ELEMENT_SUBTYPE_WIFI &&
                        element->subtype != CONNMAN_ELEMENT_SUBTYPE_WIMAX)
                return;
 
-       dbus_message_iter_open_container(dict, DBUS_TYPE_DICT_ENTRY,
-                                                               NULL, &entry);
-
-       dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key);
+       dbus_message_iter_append_basic(entry, DBUS_TYPE_STRING, &key);
 
-       dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT,
+       dbus_message_iter_open_container(entry, DBUS_TYPE_VARIANT,
                DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_OBJECT_PATH_AS_STRING,
                                                                &value);
 
@@ -415,9 +461,7 @@ static void append_networks(struct connman_element *element,
 
        dbus_message_iter_close_container(&value, &iter);
 
-       dbus_message_iter_close_container(&entry, &value);
-
-       dbus_message_iter_close_container(dict, &entry);
+       dbus_message_iter_close_container(entry, &value);
 }
 
 static DBusMessage *device_get_properties(DBusConnection *conn,
@@ -425,7 +469,7 @@ static DBusMessage *device_get_properties(DBusConnection *conn,
 {
        struct connman_element *element = data;
        DBusMessage *reply;
-       DBusMessageIter array, dict;
+       DBusMessageIter array, dict, entry;
        const char *str;
 
        DBG("conn %p", conn);
@@ -454,7 +498,12 @@ static DBusMessage *device_get_properties(DBusConnection *conn,
        connman_dbus_dict_append_variant(&dict, "Powered",
                                        DBUS_TYPE_BOOLEAN, &element->enabled);
 
-       append_networks(element, &dict);
+       dbus_message_iter_open_container(&dict, DBUS_TYPE_DICT_ENTRY,
+                                                               NULL, &entry);
+
+       append_networks(element, &entry);
+
+       dbus_message_iter_close_container(&dict, &entry);
 
        add_common_properties(element, &dict);
 
@@ -965,8 +1014,10 @@ static void enable_element(struct connman_element *element)
                return;
 
        if (element->driver && element->driver->enable) {
-               if (element->driver->enable(element) == 0)
+               if (element->driver->enable(element) == 0) {
                        element->enabled = TRUE;
+                       emit_enabled_signal(connection, element);
+               }
        }
 }
 
@@ -1040,8 +1091,10 @@ static void disable_element(struct connman_element *element)
                return;
 
        if (element->driver && element->driver->disable) {
-               if (element->driver->disable(element) == 0)
+               if (element->driver->disable(element) == 0) {
                        element->enabled = FALSE;
+                       emit_enabled_signal(connection, element);
+               }
        }
 }
 
@@ -1654,6 +1707,29 @@ static void emit_devices_signal(DBusConnection *conn)
        g_dbus_send_message(conn, signal);
 }
 
+static void emit_networks_signal(DBusConnection *conn,
+                                       struct connman_element *device)
+{
+       DBusMessage *signal;
+       DBusMessageIter entry;
+
+       DBG("conn %p", conn);
+
+       if (device == NULL)
+               return;
+
+       signal = dbus_message_new_signal(device->path,
+                               CONNMAN_DEVICE_INTERFACE, "PropertyChanged");
+       if (signal == NULL)
+               return;
+
+       dbus_message_iter_init_append(signal, &entry);
+
+       append_networks(device, &entry);
+
+       g_dbus_send_message(conn, signal);
+}
+
 static void append_connections(DBusMessageIter *entry)
 {
        DBusMessageIter value, iter;
@@ -1790,6 +1866,8 @@ static void register_element(gpointer data, gpointer user_data)
                                        NULL, element, NULL) == FALSE)
                        connman_error("Failed to register %s network",
                                                                element->path);
+               else
+                       emit_networks_signal(connection, element->parent);
        }
 
        if (element->type == CONNMAN_ELEMENT_TYPE_CONNECTION) {
@@ -1923,9 +2001,12 @@ static gboolean remove_element(GNode *node, gpointer user_data)
                                                CONNMAN_CONNECTION_INTERFACE);
        }
 
-       if (element->type == CONNMAN_ELEMENT_TYPE_NETWORK)
+       if (element->type == CONNMAN_ELEMENT_TYPE_NETWORK) {
+               emit_networks_signal(connection, element->parent);
+
                g_dbus_unregister_interface(connection, element->path,
                                                CONNMAN_NETWORK_INTERFACE);
+       }
 
        if (element->type == CONNMAN_ELEMENT_TYPE_DEVICE &&
                        element->subtype != CONNMAN_ELEMENT_SUBTYPE_NETWORK) {