static void populate_service_list(struct connman_session *session) { struct service_entry *entry; GSequenceIter *iter; session->service_hash = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, NULL); session->service_list = __connman_service_get_list(session, service_match, create_service_entry, destroy_service_entry); g_sequence_sort(session->service_list, sort_services, session); iter = g_sequence_get_begin_iter(session->service_list); while (g_sequence_iter_is_end(iter) == FALSE) { entry = g_sequence_get(iter); DBG("service %p type %s name %s", entry->service, service2bearer(connman_service_get_type(entry->service)), entry->name); g_hash_table_replace(session->service_hash, entry->service, iter); iter = g_sequence_iter_next(iter); } }
static struct service_entry *create_service_entry(struct connman_service *service, const char *name, enum connman_service_state state) { struct service_entry *entry; enum connman_service_type type; int idx; entry = g_try_new0(struct service_entry, 1); if (entry == NULL) return entry; entry->reason = CONNMAN_SESSION_REASON_UNKNOWN; entry->state = state; if (name != NULL) entry->name = name; else entry->name = ""; entry->service = service; idx = __connman_service_get_index(entry->service); entry->ifname = connman_inet_ifname(idx); if (entry->ifname == NULL) entry->ifname = g_strdup(""); type = connman_service_get_type(entry->service); entry->bearer = service2bearer(type); return entry; }
static void append_notify(DBusMessageIter *dict, struct connman_session *session) { struct session_info *info = session->info; struct session_info *info_last = session->info_last; struct connman_service *service; enum connman_service_type type; const char *name, *bearer; char *ifname; int idx; if (session->append_all || info->state != info_last->state) { const char *state = state2string(info->state); connman_dbus_dict_append_basic(dict, "State", DBUS_TYPE_STRING, &state); info_last->state = info->state; } if (session->append_all || session->service != session->service_last) { if (session->service) { service = session->service; name = __connman_service_get_name(service); idx = __connman_service_get_index(service); ifname = connman_inet_ifname(idx); if (!ifname) ifname = g_strdup(""); type = connman_service_get_type(service); bearer = service2bearer(type); } else { service = NULL; name = ""; ifname = g_strdup(""); bearer = ""; } connman_dbus_dict_append_basic(dict, "Name", DBUS_TYPE_STRING, &name); connman_dbus_dict_append_dict(dict, "IPv4", append_ipconfig_ipv4, service); connman_dbus_dict_append_dict(dict, "IPv6", append_ipconfig_ipv6, service); connman_dbus_dict_append_basic(dict, "Interface", DBUS_TYPE_STRING, &ifname); connman_dbus_dict_append_basic(dict, "Bearer", DBUS_TYPE_STRING, &bearer); g_free(ifname); session->service_last = session->service; } if (session->append_all || info->config.type != info_last->config.type) { const char *type = type2string(info->config.type); connman_dbus_dict_append_basic(dict, "ConnectionType", DBUS_TYPE_STRING, &type); info_last->config.type = info->config.type; } if (session->append_all || info->config.allowed_bearers != info_last->config.allowed_bearers) { connman_dbus_dict_append_array(dict, "AllowedBearers", DBUS_TYPE_STRING, append_allowed_bearers, info); info_last->config.allowed_bearers = info->config.allowed_bearers; } session->append_all = false; }