service: Add ServicesChanged signal
authorPatrik Flykt <patrik.flykt@linux.intel.com>
Tue, 3 Apr 2012 09:13:35 +0000 (12:13 +0300)
committerPatrik Flykt <patrik.flykt@linux.intel.com>
Wed, 11 Apr 2012 14:02:50 +0000 (17:02 +0300)
Send ServicesChanged signal instead of consecutive ServicesAdded and
ServicesRemoved signals.

src/manager.c
src/service.c

index e475d32..f486325 100644 (file)
@@ -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" },
        { },
 };
 
index 5b5dac6..0539552 100644 (file)
@@ -3550,40 +3550,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;
@@ -3593,57 +3560,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)
@@ -3653,7 +3634,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)
@@ -3669,7 +3650,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[] = {
@@ -5869,7 +5850,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);
        }