diff options
Diffstat (limited to 'src/service.c')
-rwxr-xr-x | src/service.c | 85 |
1 files changed, 80 insertions, 5 deletions
diff --git a/src/service.c b/src/service.c index fb780fbe..b130888b 100755 --- a/src/service.c +++ b/src/service.c @@ -4888,6 +4888,30 @@ bool connman_service_get_internet_connection(struct connman_service *service) return service->is_internet_connection; } + +DBusMessage *connman_service_get_defaut_info(DBusMessage *msg, + struct connman_service *service) +{ + DBusMessage *reply; + DBusMessageIter array, dict; + + reply = dbus_message_new_method_return(msg); + if (!reply) + return NULL; + + dbus_message_iter_init_append(reply, &array); + + if (service) + dbus_message_iter_append_basic(&array, DBUS_TYPE_OBJECT_PATH, + &service->path); + + connman_dbus_dict_open(&array, &dict); + if (service) + append_properties(&dict, FALSE, service); + connman_dbus_dict_close(&array, &dict); + + return reply; +} #endif void __connman_service_set_proxy_autoconfig(struct connman_service *service, @@ -6331,6 +6355,9 @@ static bool auto_connect_service(GList *services, bool ignore[MAX_CONNMAN_SERVICE_TYPES] = { }; bool autoconnecting = false; GList *list; +#if defined TIZEN_EXT + GList *wifi_ignore = NULL; +#endif DBG("preferred %d sessions %d reason %s", preferred, active_count, reason2string(reason)); @@ -6346,6 +6373,13 @@ static bool auto_connect_service(GList *services, for (list = services; list; list = list->next) { service = list->data; +#if defined TIZEN_EXT + if (service->type == CONNMAN_SERVICE_TYPE_WIFI) { + int index = connman_network_get_index(service->network); + if (g_slist_find(wifi_ignore, GINT_TO_POINTER(index)) != NULL) + continue; + } else +#endif if (ignore[service->type]) { DBG("service %p type %s ignore", service, __connman_service_type2string(service->type)); @@ -6369,9 +6403,18 @@ static bool auto_connect_service(GList *services, if (service->pending || is_connecting(service->state) || is_connected(service->state)) { +#if defined TIZEN_EXT + if (service->type == CONNMAN_SERVICE_TYPE_WIFI) { + int index = connman_network_get_index(service->network); + wifi_ignore = g_slist_prepend(wifi_ignore, GINT_TO_POINTER(index)); + + autoconnecting = true; + continue; + } +#else if (autoconnect_no_session_active(service)) return true; - +#endif ignore[service->type] = true; autoconnecting = true; @@ -6388,6 +6431,7 @@ static bool auto_connect_service(GList *services, #if defined TIZEN_EXT DBG("Service is not favorite, autoconnecting %d", autoconnecting); + g_slist_free(wifi_ignore); #endif return autoconnecting; } @@ -6403,7 +6447,9 @@ static bool auto_connect_service(GList *services, if (is_ignore(service) || service->state != CONNMAN_SERVICE_STATE_IDLE) continue; - +#if defined TIZEN_EXT + if (service->type != CONNMAN_SERVICE_TYPE_WIFI) +#endif if (autoconnect_already_connecting(service, autoconnecting)) { DBG("service %p type %s has no users", service, __connman_service_type2string(service->type)); @@ -6414,13 +6460,15 @@ static bool auto_connect_service(GList *services, (preferred) ? "preferred" : reason2string(reason)); __connman_service_connect(service, reason); - +#if !defined TIZEN_EXT if (autoconnect_no_session_active(service)) return true; - +#endif ignore[service->type] = true; } - +#if defined TIZEN_EXT + g_slist_free(wifi_ignore); +#endif return autoconnecting; } @@ -7731,6 +7779,25 @@ static gint service_compare(gconstpointer a, gconstpointer b) a_connected = is_connected(state_a); b_connected = is_connected(state_b); +#if defined TIZEN_EXT + if ((a_connected && b_connected) && + state_a == state_b && + service_a->type == CONNMAN_SERVICE_TYPE_WIFI && + service_b->type == CONNMAN_SERVICE_TYPE_WIFI) { + const char *default_interface = + connman_option_get_string("DefaultWifiInterface"); + const char *ifname_a = connman_device_get_string( + connman_network_get_device(service_a->network), "Interface"); + const char *ifname_b = connman_device_get_string( + connman_network_get_device(service_b->network), "Interface"); + + if (g_strcmp0(default_interface, ifname_a) == 0) + return -1; + else if (g_strcmp0(default_interface, ifname_b) == 0) + return 1; + } +#endif + if (a_connected && b_connected) { if (service_a->order > service_b->order) return -1; @@ -8764,6 +8831,10 @@ static int service_indicate_state(struct connman_service *service) #if defined TIZEN_EXT if (service->type == CONNMAN_SERVICE_TYPE_WIFI) set_priority_connected_service(); + + if (!is_connected(old_state)) + connman_device_send_connected_signal( + connman_network_get_device(service->network), true); #endif break; @@ -8855,6 +8926,10 @@ static int service_indicate_state(struct connman_service *service) (old_state == CONNMAN_SERVICE_STATE_READY && new_state != CONNMAN_SERVICE_STATE_ONLINE)) { __connman_notifier_disconnect(service->type); +#if defined TIZEN_EXT + connman_device_send_connected_signal( + connman_network_get_device(service->network), false); +#endif } if (new_state == CONNMAN_SERVICE_STATE_ONLINE) { |