X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Fnetwork.c;h=44503c1ffd4574c6b775f4be38db52b6ac4d9bbe;hb=254c95953680203a984aee5cd43443958c506ea9;hp=754380d4f2044baeab70d3e81d9a485e47cd7660;hpb=a0f99ce23943d691636a6a27d647ca42a85fcd24;p=connman diff --git a/src/network.c b/src/network.c index 754380d..44503c1 100644 --- a/src/network.c +++ b/src/network.c @@ -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);