Ensure that favorite information are stored
[connman] / src / network.c
index 754380d..44503c1 100644 (file)
@@ -33,6 +33,8 @@ struct connman_network {
        struct connman_element element;
        enum connman_network_type type;
        enum connman_network_protocol protocol;
+       connman_bool_t associating;
+       connman_bool_t secondary;
        connman_bool_t available;
        connman_bool_t connected;
        connman_bool_t remember;
@@ -238,7 +240,7 @@ static DBusMessage *do_connect(DBusConnection *conn,
                return __connman_error_permission_denied(msg);
 
        if (network->connected == TRUE)
-               return __connman_error_failed(msg);
+               return __connman_error_failed(msg, EALREADY);
 
        if (network->driver && network->driver->connect) {
                enum connman_device_mode mode;
@@ -249,7 +251,7 @@ static DBusMessage *do_connect(DBusConnection *conn,
 
                err = network->driver->connect(network);
                if (err < 0 && err != -EINPROGRESS)
-                       return __connman_error_failed(msg);
+                       return __connman_error_failed(msg, -err);
        } else
                network->connected = TRUE;
 
@@ -269,7 +271,7 @@ static DBusMessage *do_disconnect(DBusConnection *conn,
                return __connman_error_permission_denied(msg);
 
        if (network->connected == FALSE)
-               return __connman_error_failed(msg);
+               return __connman_error_failed(msg, EINVAL);
 
        connman_element_unregister_children(&network->element);
 
@@ -278,7 +280,7 @@ static DBusMessage *do_disconnect(DBusConnection *conn,
        if (network->driver && network->driver->disconnect) {
                err = network->driver->disconnect(network);
                if (err < 0 && err != -EINPROGRESS)
-                       return __connman_error_failed(msg);
+                       return __connman_error_failed(msg, -err);
        } else
                network->connected = FALSE;
 
@@ -467,7 +469,8 @@ struct connman_network *connman_network_create(const char *identifier,
 
        __connman_element_initialize(&network->element);
 
-       temp = connman_dbus_encode_string(identifier);
+       //temp = connman_dbus_encode_string(identifier);
+       temp = g_strdup(identifier);
        if (temp == NULL) {
                g_free(network);
                return NULL;
@@ -485,7 +488,8 @@ struct connman_network *connman_network_create(const char *identifier,
 
        connman_element_set_uint8(&network->element, "Strength", strength);
 
-       network->type = type;
+       network->type       = type;
+       network->secondary  = FALSE;
        network->identifier = g_strdup(identifier);
 
        return network;
@@ -516,6 +520,22 @@ void connman_network_unref(struct connman_network *network)
        connman_element_unref(&network->element);
 }
 
+const char *__connman_network_get_type(struct connman_network *network)
+{
+       return type2string(network->type);
+}
+
+/**
+ * connman_network_get_type:
+ * @network: network structure
+ *
+ * Get type of network
+ */
+enum connman_network_type connman_network_get_type(struct connman_network *network)
+{
+       return network->type;
+}
+
 /**
  * connman_network_get_identifier:
  * @network: network structure
@@ -588,6 +608,19 @@ void connman_network_set_group(struct connman_network *network,
        network->group = g_strdup(group);
 }
 
+const char *__connman_network_get_group(struct connman_network *network)
+{
+       return network->group;
+}
+
+const char *__connman_network_get_ident(struct connman_network *network)
+{
+       if (network->device == NULL)
+               return NULL;
+
+       return __connman_device_get_ident(network->device);
+}
+
 /**
  * connman_network_set_available:
  * @network: network structure
@@ -651,6 +684,9 @@ connman_bool_t connman_network_get_available(struct connman_network *network)
 static gboolean set_connected(gpointer user_data)
 {
        struct connman_network *network = user_data;
+       struct connman_service *service;
+
+       service = __connman_service_lookup_from_network(network);
 
        if (network->connected == TRUE) {
                struct connman_element *element;
@@ -681,8 +717,14 @@ static gboolean set_connected(gpointer user_data)
                        if (connman_element_register(element,
                                                &network->element) < 0)
                                connman_element_unref(element);
+
+                       __connman_service_indicate_state(service,
+                                       CONNMAN_SERVICE_STATE_CONFIGURATION);
                }
        } else {
+               __connman_service_indicate_state(service,
+                                               CONNMAN_SERVICE_STATE_IDLE);
+
                connman_element_unregister_children(&network->element);
 
                __connman_device_set_network(network->device, NULL);
@@ -694,6 +736,34 @@ static gboolean set_connected(gpointer user_data)
 }
 
 /**
+ * connman_network_set_associating:
+ * @network: network structure
+ * @associating: associating state
+ *
+ * Change associating state of network
+ */
+int connman_network_set_associating(struct connman_network *network,
+                                               connman_bool_t associating)
+{
+       DBG("network %p associating %d", network, associating);
+
+       if (network->associating == associating)
+               return -EALREADY;
+
+       network->associating = associating;
+
+       if (associating == TRUE) {
+               struct connman_service *service;
+
+               service = __connman_service_lookup_from_network(network);
+               __connman_service_indicate_state(service,
+                                       CONNMAN_SERVICE_STATE_ASSOCIATION);
+       }
+
+       return 0;
+}
+
+/**
  * connman_network_set_connected:
  * @network: network structure
  * @connected: connected state
@@ -714,6 +784,9 @@ int connman_network_set_connected(struct connman_network *network,
 
        network->connected = connected;
 
+       if (connected == TRUE)
+               network->associating = FALSE;
+
        if (network->registered == FALSE) {
                g_idle_add(set_connected, network);
                return 0;
@@ -1078,7 +1151,21 @@ static int network_probe(struct connman_element *element)
                return err;
        }
 
-       __connman_profile_add_network(network);
+       network->secondary = connman_device_get_secondary(network->device);
+
+       switch (network->type) {
+       case CONNMAN_NETWORK_TYPE_UNKNOWN:
+       case CONNMAN_NETWORK_TYPE_VENDOR:
+       case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
+       case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
+       case CONNMAN_NETWORK_TYPE_HSO:
+               break;
+       case CONNMAN_NETWORK_TYPE_WIFI:
+       case CONNMAN_NETWORK_TYPE_WIMAX:
+               if (network->secondary == FALSE)
+                       __connman_profile_add_network(network);
+               break;
+       }
 
        return 0;
 }
@@ -1095,7 +1182,19 @@ static void network_remove(struct connman_element *element)
        if (network->driver == NULL)
                return;
 
-       __connman_profile_remove_network(network);
+       switch (network->type) {
+       case CONNMAN_NETWORK_TYPE_UNKNOWN:
+       case CONNMAN_NETWORK_TYPE_VENDOR:
+       case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
+       case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
+       case CONNMAN_NETWORK_TYPE_HSO:
+               break;
+       case CONNMAN_NETWORK_TYPE_WIFI:
+       case CONNMAN_NETWORK_TYPE_WIMAX:
+               if (network->secondary == FALSE)
+                       __connman_profile_remove_network(network);
+               break;
+       }
 
        unregister_interface(element);
 
@@ -1259,7 +1358,8 @@ update:
 
        data = g_key_file_to_data(keyfile, &length, NULL);
 
-       g_file_set_contents(pathname, data, length, NULL);
+       if (g_file_set_contents(pathname, data, length, NULL) == FALSE)
+               connman_error("Failed to store network information");
 
 done:
        g_free(data);