---
 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

Reply via email to