The current UI requires the user to mouse-over and reveal a tool
tip (or click an indicator) to discover the registration state
(aka polling). If the user inadvertently re-registers on a
roaming network, the operation is silent until the user decides
to check the applet for network status, possibly incurring
expensive roaming tariffs in the mean time.

So to prevent silent registration changes, alert the user with a
notification when the GSM registration status changes to home or
to roaming.
---
        v1 -> v2: Fix incorrect mapping of reg_state to mb_state.
        v2 -> v3: Ensure we preserve the meaning of info->reg_state.
                  Use the gsm_state_to_mb_state mapping function.
                  Also handle the reply of GetRegistrationInfo().

Signed-off-by: Andrew Bird <a...@spheresystems.co.uk>
---
 src/applet-device-gsm.c |   34 +++++++++++++++++++++++++++++++---
 1 files changed, 31 insertions(+), 3 deletions(-)

diff --git a/src/applet-device-gsm.c b/src/applet-device-gsm.c
index 5d0d584..76fd81e 100644
--- a/src/applet-device-gsm.c
+++ b/src/applet-device-gsm.c
@@ -1083,6 +1083,25 @@ parse_op_name (GsmDeviceInfo *info, const char *orig, 
const char *op_code)
        return find_provider_for_mcc_mnc (info->providers, orig);
 }
 
+static void
+notify_user_of_gsm_reg_change(GsmDeviceInfo *info)
+{
+       guint32 mb_state = gsm_state_to_mb_state (info);
+
+       if (mb_state == MB_STATE_HOME)
+               applet_do_notify_with_pref (info->applet,
+                                           _("GSM network."),
+                                           _("You are now registered on the 
home network."),
+                                           "notification-gsm-high",
+                                           
PREF_DISABLE_CONNECTED_NOTIFICATIONS);
+       else if (mb_state == MB_STATE_ROAMING)
+               applet_do_notify_with_pref (info->applet,
+                                           _("GSM network."),
+                                           _("You are now registered on a 
roaming network."),
+                                           "notification-gsm-high",
+                                           
PREF_DISABLE_CONNECTED_NOTIFICATIONS);
+}
+
 #define REG_INFO_TYPE (dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, 
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID))
 #define DBUS_TYPE_G_MAP_OF_VARIANT (dbus_g_type_get_map ("GHashTable", 
G_TYPE_STRING, G_TYPE_VALUE))
 
@@ -1101,7 +1120,7 @@ reg_info_reply (DBusGProxy *proxy, DBusGProxyCall *call, 
gpointer user_data)
                if (array->n_values == 3) {
                        value = g_value_array_get_nth (array, 0);
                        if (G_VALUE_HOLDS_UINT (value))
-                               new_state = g_value_get_uint (value);
+                               new_state = g_value_get_uint (value) + 1;
 
                        value = g_value_array_get_nth (array, 1);
                        if (G_VALUE_HOLDS_STRING (value)) {
@@ -1120,7 +1139,11 @@ reg_info_reply (DBusGProxy *proxy, DBusGProxyCall *call, 
gpointer user_data)
                g_value_array_free (array);
        }
 
-       info->reg_state = new_state + 1;
+       if (info->reg_state != new_state) {
+               info->reg_state = new_state;
+               notify_user_of_gsm_reg_change (info);
+       }
+
        info->op_code = new_op_code;
        info->op_name = new_op_name;
 
@@ -1281,8 +1304,13 @@ reg_info_changed_cb (DBusGProxy *proxy,
                      gpointer user_data)
 {
        GsmDeviceInfo *info = user_data;
+       guint32 new_state = reg_state + 1;
+
+       if (info->reg_state != new_state) {
+               info->reg_state = new_state;
+               notify_user_of_gsm_reg_change (info);
+       }
 
-       info->reg_state = reg_state + 1;
        g_free (info->op_code);
        info->op_code = strlen (op_code) ? g_strdup (op_code) : NULL;
        g_free (info->op_name);
-- 
1.7.4.4

_______________________________________________
networkmanager-list mailing list
networkmanager-list@gnome.org
http://mail.gnome.org/mailman/listinfo/networkmanager-list

Reply via email to