From: Patrik Flykt <[email protected]>

Send ServicesChanged signal instead of consecutive ServicesAdded and
ServicesRemoved signals.
---
 src/manager.c |    3 +-
 src/service.c |   95 +++++++++++++++++++++++----------------------------------
 2 files changed, 39 insertions(+), 59 deletions(-)

diff --git a/src/manager.c b/src/manager.c
index e475d32..f486325 100644
--- a/src/manager.c
+++ b/src/manager.c
@@ -425,8 +425,7 @@ static GDBusSignalTable manager_signals[] = {
        { "PropertyChanged", "sv" },
        { "TechnologyAdded", "oa{sv}" },
        { "TechnologyRemoved", "o" },
-       { "ServicesAdded",   "a(oa{sv})" },
-       { "ServicesRemoved", "ao" },
+       { "ServicesChanged",   "a(oa{sv})ao" },
        { },
 };
 
diff --git a/src/service.c b/src/service.c
index ba35dc9..883a8b1 100644
--- a/src/service.c
+++ b/src/service.c
@@ -3322,40 +3322,7 @@ static struct _services_notify {
        GHashTable *remove;
 } *services_notify;
 
-static void append_removed(gpointer key, gpointer value, gpointer user_data)
-{
-       char *objpath = key;
-       DBusMessageIter *iter = user_data;
-
-       DBG("removed %s", objpath);
-       dbus_message_iter_append_basic(iter, DBUS_TYPE_OBJECT_PATH, &objpath);
-}
-
-static void service_send_removed(void)
-{
-       DBusMessage *signal;
-       DBusMessageIter iter, array;
-
-       signal = dbus_message_new_signal(CONNMAN_MANAGER_PATH,
-                       CONNMAN_MANAGER_INTERFACE, "ServicesRemoved");
-       if (signal == NULL)
-               return;
-
-       dbus_message_iter_init_append(signal, &iter);
-       dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
-                       DBUS_TYPE_OBJECT_PATH_AS_STRING, &array);
-
-       g_hash_table_foreach(services_notify->remove, append_removed, &array);
-
-       dbus_message_iter_close_container(&iter, &array);
-
-       dbus_connection_send(connection, signal, NULL);
-       dbus_message_unref(signal);
-
-       g_hash_table_remove_all(services_notify->remove);
-}
-
-static void service_send_added_foreach(gpointer data, gpointer user_data)
+static void service_append_added_foreach(gpointer data, gpointer user_data)
 {
        struct connman_service *service = data;
        DBusMessageIter *iter = user_data;
@@ -3365,57 +3332,71 @@ static void service_send_added_foreach(gpointer data, 
gpointer user_data)
                return;
        }
 
-       DBG("added %s", service->path);
-
        if (g_hash_table_lookup(services_notify->add, service->path) != NULL) {
+               DBG("new %s", service->path);
+
                append_struct(service, iter);
                g_hash_table_remove(services_notify->add, service->path);
        } else {
+               DBG("changed %s", service->path);
+
                append_struct_service(iter, NULL, service);
        }
 }
 
-static void service_send_added_ordered(DBusMessageIter *iter, void *user_data)
+static void service_append_ordered(DBusMessageIter *iter, void *user_data)
+{
+       g_sequence_foreach(service_list, service_append_added_foreach, iter);
+}
+
+static void append_removed(gpointer key, gpointer value, gpointer user_data)
 {
-       g_sequence_foreach(service_list, service_send_added_foreach, iter);
+       char *objpath = key;
+       DBusMessageIter *iter = user_data;
+
+       DBG("removed %s", objpath);
+       dbus_message_iter_append_basic(iter, DBUS_TYPE_OBJECT_PATH, &objpath);
 }
 
-static void service_send_added(void)
+static gboolean service_send_changed(gpointer data)
 {
        DBusMessage *signal;
+       DBusMessageIter iter, array;
+
+       DBG("");
 
        signal = dbus_message_new_signal(CONNMAN_MANAGER_PATH,
-                       CONNMAN_MANAGER_INTERFACE, "ServicesAdded");
+                       CONNMAN_MANAGER_INTERFACE, "ServicesChanged");
        if (signal == NULL)
-               return;
+               return FALSE;
 
        __connman_dbus_append_objpath_dict_array(signal,
-                       service_send_added_ordered, NULL);
+                       service_append_ordered, NULL);
+
+       dbus_message_iter_init_append(signal, &iter);
+       dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
+                       DBUS_TYPE_OBJECT_PATH_AS_STRING, &array);
+
+       g_hash_table_foreach(services_notify->remove, append_removed, &array);
+
+       dbus_message_iter_close_container(&iter, &array);
 
        dbus_connection_send(connection, signal, NULL);
        dbus_message_unref(signal);
 
+       g_hash_table_remove_all(services_notify->remove);
        g_hash_table_remove_all(services_notify->add);
-}
-
-static gboolean service_send_signals(gpointer data)
-{
-       if (g_hash_table_size(services_notify->remove) > 0)
-               service_send_removed();
-
-       if (g_hash_table_size(services_notify->add) > 0)
-               service_send_added();
 
        services_notify->id = 0;
        return FALSE;
 }
 
-static void service_schedule_signals(void)
+static void service_schedule_changed(void)
 {
        if (services_notify->id != 0)
-               g_source_remove(services_notify->id);
+               return;
 
-       services_notify->id = g_timeout_add(100, service_send_signals, NULL);
+       services_notify->id = g_timeout_add(100, service_send_changed, NULL);
 }
 
 static void service_schedule_added(struct connman_service *service)
@@ -3425,7 +3406,7 @@ static void service_schedule_added(struct connman_service 
*service)
        g_hash_table_remove(services_notify->remove, service->path);
        g_hash_table_insert(services_notify->add, service->path, service);
 
-       service_schedule_signals();
+       service_schedule_changed();
 }
 
 static void service_schedule_removed(struct connman_service *service)
@@ -3441,7 +3422,7 @@ static void service_schedule_removed(struct 
connman_service *service)
        g_hash_table_insert(services_notify->remove, g_strdup(service->path),
                        NULL);
 
-       service_schedule_signals();
+       service_schedule_changed();
 }
 
 static GDBusMethodTable service_methods[] = {
@@ -5588,7 +5569,7 @@ void __connman_service_cleanup(void)
 
        if (services_notify->id != 0) {
                g_source_remove(services_notify->id);
-               service_send_signals(NULL);
+               service_send_changed(NULL);
                g_hash_table_destroy(services_notify->remove);
                g_hash_table_destroy(services_notify->add);
        }
-- 
1.7.9.1

_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman

Reply via email to