Use idle callback and make sure it is not called twice
[connman] / src / network.c
index e0f0fa8..8cda558 100644 (file)
@@ -636,48 +636,11 @@ connman_bool_t connman_network_get_available(struct connman_network *network)
        return network->available;
 }
 
-/**
- * connman_network_set_connected:
- * @network: network structure
- * @connected: connected state
- *
- * Change connected state of network
- */
-int connman_network_set_connected(struct connman_network *network,
-                                               connman_bool_t connected)
+static gboolean set_connected(gpointer user_data)
 {
-       DBusMessage *signal;
-       DBusMessageIter entry, value;
-       const char *key = "Connected";
-
-       DBG("network %p connected %d", network, connected);
-
-       if (network->connected == connected)
-               return -EALREADY;
-
-       network->connected = connected;
-
-       if (network->registered == FALSE)
-               goto connected;
+       struct connman_network *network = user_data;
 
-       signal = dbus_message_new_signal(network->element.path,
-                               CONNMAN_NETWORK_INTERFACE, "PropertyChanged");
-       if (signal == NULL)
-               return 0;
-
-       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, &connected);
-       dbus_message_iter_close_container(&entry, &value);
-
-       g_dbus_send_message(connection, signal);
-
-connected:
-       if (connected == TRUE) {
+       if (network->connected == TRUE) {
                struct connman_element *element;
                enum connman_element_type type = CONNMAN_ELEMENT_TYPE_UNKNOWN;
 
@@ -715,6 +678,53 @@ connected:
                __connman_device_decrease_connections(network->device);
        }
 
+       return FALSE;
+}
+
+/**
+ * connman_network_set_connected:
+ * @network: network structure
+ * @connected: connected state
+ *
+ * Change connected state of network
+ */
+int connman_network_set_connected(struct connman_network *network,
+                                               connman_bool_t connected)
+{
+       DBusMessage *signal;
+       DBusMessageIter entry, value;
+       const char *key = "Connected";
+
+       DBG("network %p connected %d", network, connected);
+
+       if (network->connected == connected)
+               return -EALREADY;
+
+       network->connected = connected;
+
+       if (network->registered == FALSE) {
+               g_idle_add(set_connected, network);
+               return 0;
+       }
+
+       signal = dbus_message_new_signal(network->element.path,
+                               CONNMAN_NETWORK_INTERFACE, "PropertyChanged");
+       if (signal == NULL)
+               return 0;
+
+       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, &connected);
+       dbus_message_iter_close_container(&entry, &value);
+
+       g_dbus_send_message(connection, signal);
+
+       set_connected(network);
+
        return 0;
 }