From 4416fef41f8bc439cb61dbd839a4f4bfce80f7dd Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Thu, 14 Apr 2011 13:02:52 +0200 Subject: [PATCH] session: Notify only changed settings --- src/session.c | 76 +++++++++++++++++++++++++++++------------------------------ 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/src/session.c b/src/session.c index d4ed430..ec3c759 100644 --- a/src/session.c +++ b/src/session.c @@ -66,6 +66,7 @@ struct connman_session { char *notify_path; guint notify_watch; + connman_bool_t info_dirty; struct session_info info; struct session_info info_last; @@ -409,26 +410,26 @@ static void append_notify(DBusMessageIter *dict, &info->marker); info_last->marker = info->marker; } + + session->info_dirty = FALSE; } -static gboolean session_notify(gpointer user_data) +static int session_notify(struct connman_session *session) { - struct connman_session *session = user_data; - - DBusMessage *msg; DBusMessageIter array, dict; + if (session->info_dirty == FALSE) + return 0; + DBG("session %p owner %s notify_path %s", session, session->owner, session->notify_path); msg = dbus_message_new_method_call(session->owner, session->notify_path, CONNMAN_NOTIFICATION_INTERFACE, "Update"); - if (msg == NULL) { - connman_error("Could not create notification message"); - return FALSE; - } + if (msg == NULL) + return -ENOMEM; dbus_message_iter_init_append(msg, &array); connman_dbus_dict_open(&array, &dict); @@ -439,7 +440,9 @@ static gboolean session_notify(gpointer user_data) g_dbus_send_message(connection, msg); - return FALSE; + session->info_dirty = FALSE; + + return 0; } static void ipconfig_ipv4_changed(struct connman_session *session) @@ -815,26 +818,16 @@ static DBusMessage *change_session(DBusConnection *conn, { struct connman_session *session = user_data; struct session_info *info = &session->info; + struct session_info *info_last = &session->info_last; DBusMessageIter iter, value; - DBusMessage *reply; - DBusMessageIter reply_array, reply_dict; const char *name; GSList *allowed_bearers; + int err; DBG("session %p", session); if (dbus_message_iter_init(msg, &iter) == FALSE) return __connman_error_invalid_arguments(msg); - reply = dbus_message_new_method_call(session->owner, - session->notify_path, - CONNMAN_NOTIFICATION_INTERFACE, - "Update"); - if (reply == NULL) - return __connman_error_failed(msg, ENOMEM); - - dbus_message_iter_init_append(reply, &reply_array); - connman_dbus_dict_open(&reply_array, &reply_dict); - dbus_message_iter_get_basic(&iter, &name); dbus_message_iter_next(&iter); dbus_message_iter_recurse(&iter, &value); @@ -851,15 +844,14 @@ static DBusMessage *change_session(DBusConnection *conn, if (allowed_bearers == NULL) { allowed_bearers = session_allowed_bearers_any(); - if (allowed_bearers == NULL) { - dbus_message_unref(reply); + if (allowed_bearers == NULL) return __connman_error_failed(msg, ENOMEM); - } } info->allowed_bearers = allowed_bearers; update_allowed_bearers(session); + session->info_dirty = TRUE; } else { goto err; } @@ -869,22 +861,26 @@ static DBusMessage *change_session(DBusConnection *conn, dbus_message_iter_get_basic(&value, &info->priority); - /* update_priority(); */ + if (info_last->priority != info->priority) + session->info_dirty = TRUE; } else if (g_str_equal(name, "AvoidHandover") == TRUE) { dbus_message_iter_get_basic(&value, &info->avoid_handover); - /* update_avoid_handover(); */ - } else if (g_str_equal(name, "StayConnected") == TRUE) { + if (info_last->avoid_handover != info->avoid_handover) + session->info_dirty = TRUE; + } else if (g_str_equal(name, "StayConnected") == TRUE) { dbus_message_iter_get_basic(&value, &info->stay_connected); - /* update_stay_connected(); */ + if (info_last->stay_connected != info->stay_connected) + session->info_dirty = TRUE; } else if (g_str_equal(name, "EmergencyCall") == TRUE) { dbus_message_iter_get_basic(&value, &info->ecall); - /* update_ecall(); */ + if (info_last->ecall != info->ecall) + session->info_dirty = TRUE; } else { goto err; } @@ -894,12 +890,14 @@ static DBusMessage *change_session(DBusConnection *conn, dbus_message_iter_get_basic(&value, &info->periodic_connect); - /* update_periodic_update(); */ + if (info_last->periodic_connect != info->periodic_connect) + session->info_dirty = TRUE; } else if (g_str_equal(name, "IdleTimeout") == TRUE) { dbus_message_iter_get_basic(&value, &info->idle_timeout); - /* update_idle_timeout(); */ + if (info_last->idle_timeout != info->idle_timeout) + session->info_dirty = TRUE; } else { goto err; } @@ -911,23 +909,23 @@ static DBusMessage *change_session(DBusConnection *conn, info->roaming_policy = string2roamingpolicy(val); - /* update_roaming_allowed(); */ + if (info_last->roaming_policy != info->roaming_policy) + session->info_dirty = TRUE; } else { goto err; } break; + default: + goto err; } - append_notify(&reply_dict, session); - - connman_dbus_dict_close(&reply_array, &reply_dict); - - g_dbus_send_message(connection, reply); + err = session_notify(session); + if (err < 0) + __connman_error_failed(msg, -err); return g_dbus_create_reply(msg, DBUS_TYPE_INVALID); err: - dbus_message_unref(reply); return __connman_error_invalid_arguments(msg); } @@ -1094,6 +1092,8 @@ int __connman_session_create(DBusMessage *msg) info_last->service = (void *) 1; info_last->marker = info->marker + 1; + session->info_dirty = TRUE; + update_allowed_bearers(session); g_hash_table_replace(session_hash, session->session_path, session); -- 2.7.4