--- src/connman.h | 1 + src/tethering.c | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 91 insertions(+), 3 deletions(-)
diff --git a/src/connman.h b/src/connman.h index ed06d6a..a5ab25a 100644 --- a/src/connman.h +++ b/src/connman.h @@ -544,6 +544,7 @@ const char *__connman_tethering_get_bridge(void); void __connman_tethering_set_enabled(void); void __connman_tethering_set_disabled(void); +DBusMessage *__connman_tethering_get_info(DBusMessage *msg); void __connman_tethering_add_client(const char *mac, enum connman_service_type type, const char *ipaddress); void __connman_tethering_remove_client(const char *mac); diff --git a/src/tethering.c b/src/tethering.c index da413b2..e7bf2de 100644 --- a/src/tethering.c +++ b/src/tethering.c @@ -319,6 +319,80 @@ void __connman_tethering_set_disabled(void) DBG("tethering stopped"); } +static void tethering_clients_foreach(gpointer key, gpointer value, + gpointer user_data) +{ + const char *mac = key; + struct tethering_clients_info *client = value; + DBusMessageIter *iter = user_data; + DBusMessageIter entry, dict; + const char *str; + + DBG("Adding %s %s", mac, client->ipaddress); + + dbus_message_iter_open_container(iter, DBUS_TYPE_STRUCT, NULL, &entry); + + dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &mac); + + connman_dbus_dict_open(&entry, &dict); + + str = __connman_service_type2string(client->type); + if (str == NULL) + str = "unknown"; + + connman_dbus_dict_append_basic(&dict, "TetheringType", + DBUS_TYPE_STRING, &str); + connman_dbus_dict_append_basic(&dict, "TetheringMACAddress", + DBUS_TYPE_STRING, &client->mac); + + str = client->ipaddress; + if (str == NULL) + str = "unknown"; + + connman_dbus_dict_append_basic(&dict, "TetheringIPAddress", + DBUS_TYPE_STRING, &str); + + connman_dbus_dict_close(&entry, &dict); + + dbus_message_iter_close_container(iter, &entry); +} + +static void tethering_clients_append(DBusMessageIter *iter, void *user_data) +{ + g_hash_table_foreach(tethering_clients, tethering_clients_foreach, + iter); +} + +DBusMessage *__connman_tethering_get_info(DBusMessage *msg) +{ + DBusMessage *reply; + + reply = dbus_message_new_method_return(msg); + if (reply == NULL) + return __connman_error_failed(msg, ENOMEM); + + __connman_dbus_append_string_dict_array(reply, tethering_clients_append, + NULL); + + return reply; +} + +static void tethering_clients_send(void) +{ + DBusMessage *signal; + + signal = dbus_message_new_signal(CONNMAN_MANAGER_PATH, + CONNMAN_MANAGER_INTERFACE, "TetheringInfoChanged"); + + if (signal == NULL) + return; + + DBG("send signal"); + + __connman_dbus_append_string_dict_array(signal, + tethering_clients_append, NULL); +} + static void tethering_clients_free(gpointer user_data) { struct tethering_clients_info *client = user_data; @@ -326,11 +400,14 @@ static void tethering_clients_free(gpointer user_data) g_free(client->mac); g_free(client->ipaddress); g_free(client); + + tethering_clients_send(); } void __connman_tethering_add_client(const char *mac, enum connman_service_type type, const char *ipaddress) { + connman_bool_t update = FALSE; struct tethering_clients_info *client; client = g_hash_table_lookup(tethering_clients, mac); @@ -339,19 +416,29 @@ void __connman_tethering_add_client(const char *mac, client->mac = g_strdup(mac); g_hash_table_replace(tethering_clients, g_strdup(mac), client); + + update = TRUE; } if (ipaddress != NULL && g_strcmp0(ipaddress, client->ipaddress) != 0) { g_free(client->ipaddress); client->ipaddress = g_strdup(ipaddress); + + update = TRUE; } if (client->type == CONNMAN_SERVICE_TYPE_UNKNOWN && - type != CONNMAN_SERVICE_TYPE_UNKNOWN) + type != CONNMAN_SERVICE_TYPE_UNKNOWN) { client->type = type; + update = TRUE; + } - DBG("type %d mac %s ip address %s", client->type, client->mac, - client->ipaddress); + if (update == TRUE) { + DBG("type %d mac %s ip address %s", client->type, client->mac, + client->ipaddress); + + tethering_clients_send(); + } } void __connman_tethering_remove_client(const char *mac) -- 1.7.10.4 _______________________________________________ connman mailing list connman@connman.net http://lists.connman.net/listinfo/connman