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;
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)
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)
g_hash_table_insert(services_notify->remove, g_strdup(service->path),
NULL);
- service_schedule_signals();
+ service_schedule_changed();
}
static GDBusMethodTable service_methods[] = {
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);
}