Fix setup of udev context before loading any plugins
[platform/upstream/connman.git] / src / network.c
index 42148a7..4567d9a 100644 (file)
@@ -37,6 +37,7 @@ struct connman_network {
        connman_bool_t secondary;
        connman_bool_t available;
        connman_bool_t connected;
+       connman_bool_t hidden;
        connman_uint8_t strength;
        connman_uint16_t frequency;
        char *identifier;
@@ -211,76 +212,12 @@ static DBusMessage *set_property(DBusConnection *conn,
        } else
                return __connman_error_invalid_property(msg);
 
-       __connman_storage_save_network(network);
-
-       return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
-}
-
-static DBusMessage *do_connect(DBusConnection *conn,
-                                       DBusMessage *msg, void *data)
-{
-       struct connman_network *network = data;
-       int err;
-
-       DBG("conn %p", conn);
-
-       if (__connman_security_check_privilege(msg,
-                                       CONNMAN_SECURITY_PRIVILEGE_MODIFY) < 0)
-               return __connman_error_permission_denied(msg);
-
-       if (network->connected == TRUE)
-               return __connman_error_failed(msg, EALREADY);
-
-       if (network->driver && network->driver->connect) {
-               enum connman_device_mode mode;
-
-               mode = connman_device_get_mode(network->device);
-               if (mode == CONNMAN_DEVICE_MODE_NETWORK_SINGLE)
-                       __connman_device_disconnect(network->device);
-
-               err = network->driver->connect(network);
-               if (err < 0 && err != -EINPROGRESS)
-                       return __connman_error_failed(msg, -err);
-       } else
-               network->connected = TRUE;
-
-       return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
-}
-
-static DBusMessage *do_disconnect(DBusConnection *conn,
-                                       DBusMessage *msg, void *data)
-{
-       struct connman_network *network = data;
-       int err;
-
-       DBG("conn %p", conn);
-
-       if (__connman_security_check_privilege(msg,
-                                       CONNMAN_SECURITY_PRIVILEGE_MODIFY) < 0)
-               return __connman_error_permission_denied(msg);
-
-       if (network->connected == FALSE)
-               return __connman_error_failed(msg, EINVAL);
-
-       connman_element_unregister_children(&network->element);
-
-       connman_device_set_disconnected(network->device, TRUE);
-
-       if (network->driver && network->driver->disconnect) {
-               err = network->driver->disconnect(network);
-               if (err < 0 && err != -EINPROGRESS)
-                       return __connman_error_failed(msg, -err);
-       } else
-               network->connected = FALSE;
-
        return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
 }
 
 static GDBusMethodTable network_methods[] = {
        { "GetProperties", "",   "a{sv}", get_properties },
        { "SetProperty",   "sv", "",      set_property   },
-       { "Connect",       "",   "",      do_connect     },
-       { "Disconnect",    "",   "",      do_disconnect  },
        { },
 };
 
@@ -461,7 +398,12 @@ struct connman_network *connman_network_create(const char *identifier,
        __connman_element_initialize(&network->element);
 
        //temp = connman_dbus_encode_string(identifier);
-       temp = g_strdup(identifier);
+       if (identifier == NULL) {
+               temp = g_strdup("hidden");
+               network->hidden = TRUE;
+       } else
+               temp = g_strdup(identifier);
+
        if (temp == NULL) {
                g_free(network);
                return NULL;
@@ -481,7 +423,7 @@ struct connman_network *connman_network_create(const char *identifier,
 
        network->type       = type;
        network->secondary  = FALSE;
-       network->identifier = g_strdup(identifier);
+       network->identifier = g_strdup(temp);
 
        network->ipconfig = connman_ipconfig_create();
        if (network->ipconfig == NULL) {
@@ -651,6 +593,29 @@ const char *__connman_network_get_ident(struct connman_network *network)
        return __connman_device_get_ident(network->device);
 }
 
+connman_bool_t __connman_network_get_weakness(struct connman_network *network)
+{
+       if (network->secondary == TRUE)
+               return FALSE;
+
+       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_MBM:
+       case CONNMAN_NETWORK_TYPE_HSO:
+       case CONNMAN_NETWORK_TYPE_WIMAX:
+               break;
+       case CONNMAN_NETWORK_TYPE_WIFI:
+               if (network->strength > 0 && network->strength < 20)
+                       return TRUE;
+               break;
+       }
+
+       return FALSE;
+}
+
 /**
  * connman_network_set_available:
  * @network: network structure
@@ -679,6 +644,9 @@ int connman_network_set_available(struct connman_network *network,
  */
 connman_bool_t connman_network_get_available(struct connman_network *network)
 {
+       if (network->hidden == TRUE)
+               return TRUE;
+
        return network->available;
 }
 
@@ -754,6 +722,7 @@ static gboolean set_connected(gpointer user_data)
                connman_element_unregister_children(&network->element);
 
                __connman_device_set_network(network->device, NULL);
+               network->hidden = FALSE;
 
                __connman_device_decrease_connections(network->device);
 
@@ -763,6 +732,8 @@ static gboolean set_connected(gpointer user_data)
 
        network->connecting = FALSE;
 
+       connman_network_set_associating(network, FALSE);
+
        return FALSE;
 }
 
@@ -782,7 +753,7 @@ int connman_network_set_connected(struct connman_network *network,
 
        DBG("network %p connected %d", network, connected);
 
-       if ((network->connecting || network->associating == TRUE) &&
+       if ((network->connecting == TRUE || network->associating == TRUE) &&
                                                        connected == FALSE) {
                connman_element_set_error(&network->element,
                                        CONNMAN_ELEMENT_ERROR_CONNECT_FAILED);
@@ -794,9 +765,6 @@ 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;
@@ -857,7 +825,10 @@ int __connman_network_connect(struct connman_network *network)
 
        DBG("network %p", network);
 
-       if (network->connected == TRUE || network->connecting == TRUE)
+       if (network->connected == TRUE)
+               return -EISCONN;
+
+       if (network->connecting == TRUE || network->associating == TRUE)
                return -EALREADY;
 
        if (network->driver == NULL)
@@ -871,11 +842,18 @@ int __connman_network_connect(struct connman_network *network)
        network->connecting = TRUE;
 
        err = network->driver->connect(network);
-       if (err == 0) {
-               network->connected = TRUE;
-               set_connected(network);
+       if (err < 0) {
+               if (err == -EINPROGRESS)
+                       connman_network_set_associating(network, TRUE);
+               else
+                       network->hidden = FALSE;
+
+               return err;
        }
 
+       network->connected = TRUE;
+       set_connected(network);
+
        return err;
 }