diff options
-rw-r--r-- | nm-applet-r861-use-modem-manager.patch | 427 |
1 files changed, 427 insertions, 0 deletions
diff --git a/nm-applet-r861-use-modem-manager.patch b/nm-applet-r861-use-modem-manager.patch new file mode 100644 index 00000000..efcfc64c --- /dev/null +++ b/nm-applet-r861-use-modem-manager.patch @@ -0,0 +1,427 @@ +diff --git a/src/Makefile.am b/src/Makefile.am +index de8ccb4..fe60b87 100644 +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -49,6 +49,9 @@ nm_applet_SOURCES = \ + applet-device-gsm.c \ + applet-device-cdma.h \ + applet-device-cdma.c \ ++ mm-types.h \ ++ nma-gsm-modem.c \ ++ nma-gsm-modem.h \ + $(NULL) + + nm_applet_LDADD = \ +diff --git a/src/applet-device-gsm.c b/src/applet-device-gsm.c +index ad125e5..9ae87e1 100644 +--- a/src/applet-device-gsm.c ++++ b/src/applet-device-gsm.c +@@ -38,6 +38,8 @@ + + #include "applet.h" + #include "applet-device-gsm.h" ++#include "nma-gsm-modem.h" ++#include "mm-types.h" + #include "utils.h" + + typedef struct { +@@ -275,16 +277,64 @@ out: + } + + static void ++signal_quality_changed (NMAGsmModem *modem, guint32 quality, gpointer user_data) ++{ ++ applet_schedule_update_icon (NM_APPLET (user_data)); ++} ++ ++static void + gsm_device_state_changed (NMDevice *device, + NMDeviceState state, + NMApplet *applet) + { +- if (state == NM_DEVICE_STATE_ACTIVATED) { +- applet_do_notify (applet, NOTIFY_URGENCY_LOW, +- _("Connection Established"), +- _("You are now connected to the GSM network."), +- "nm-device-wwan", NULL, NULL, NULL, NULL); ++ NMAGsmModem *modem; ++ char *oper_code; ++ char *oper_name; ++ char *msg; ++ guint32 reg_status; ++ ++ if (state != NM_DEVICE_STATE_ACTIVATED) ++ return; ++ ++ modem = (NMAGsmModem *) g_object_get_data (G_OBJECT (device), "gsm-modem"); ++ if (!modem) { ++ DBusGConnection *bus; ++ ++ bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, NULL); ++ if (!bus) ++ return; ++ ++ modem = nma_gsm_modem_new (bus, nm_device_get_udi (device)); ++ dbus_g_connection_unref (bus); ++ ++ g_object_set_data_full (G_OBJECT (device), "gsm-modem", modem, g_object_unref); ++ ++ g_signal_connect (modem, "signal-quality", ++ G_CALLBACK (signal_quality_changed), ++ applet); + } ++ ++ g_message ("Signal quality: %d", nma_gsm_modem_get_signal_quality (modem)); ++ g_message ("Network mode: %d", nma_gsm_modem_get_network_mode (modem)); ++ ++ oper_code = NULL; ++ oper_name = NULL; ++ ++ reg_status = nma_gsm_modem_get_registration_info (modem, &oper_code, &oper_name); ++ ++ g_message ("Reg status: %d code: %s name: %s", reg_status, oper_code, oper_name); ++ ++ msg = g_strdup_printf (_("You are now connected to the %s GSM network '%s'."), ++ reg_status == MM_GSM_MODEM_REG_STATUS_ROAMING ? _("roaming") : _("home"), ++ oper_name); ++ ++ applet_do_notify (applet, NOTIFY_URGENCY_LOW, ++ _("Connection Established"), msg, ++ "nm-device-wwan", NULL, NULL, NULL, NULL); ++ ++ g_free (oper_code); ++ g_free (oper_name); ++ g_free (msg); + } + + static GdkPixbuf * +@@ -293,6 +343,7 @@ gsm_get_icon (NMDevice *device, + char **tip, + NMApplet *applet) + { ++ NMAGsmModem *modem; + GdkPixbuf *pixbuf = NULL; + const char *iface; + +@@ -306,8 +357,40 @@ gsm_get_icon (NMDevice *device, + *tip = g_strdup_printf (_("Running PPP on device %s..."), iface); + break; + case NM_DEVICE_STATE_ACTIVATED: +- *tip = g_strdup (_("GSM connection")); +- pixbuf = applet->wwan_icon; ++ modem = (NMAGsmModem *) g_object_get_data (G_OBJECT (device), "gsm-modem"); ++ if (modem) { ++ char *oper_code; ++ char *oper_name; ++ guint32 reg_status; ++ guint32 quality; ++ ++ quality = nma_gsm_modem_get_signal_quality (modem); ++ quality = CLAMP (quality, 0, 100); ++ ++ if (quality > 80) ++ pixbuf = applet->wireless_100_icon; ++ else if (quality > 55) ++ pixbuf = applet->wireless_75_icon; ++ else if (quality > 30) ++ pixbuf = applet->wireless_50_icon; ++ else if (quality > 5) ++ pixbuf = applet->wireless_25_icon; ++ else ++ pixbuf = applet->wireless_00_icon; ++ ++ reg_status = nma_gsm_modem_get_registration_info (modem, &oper_code, &oper_name); ++ *tip = g_strdup_printf (_("%s GSM connection '%s' (%d%%)"), ++ reg_status == MM_GSM_MODEM_REG_STATUS_ROAMING ? _("Roaming") : _("Home"), ++ oper_name, quality); ++ ++ g_free (oper_name); ++ g_free (oper_code); ++ ++ } else { ++ pixbuf = applet->wireless_00_icon; ++ *tip = g_strdup_printf (_("GSM connection")); ++ } ++ + break; + default: + break; +diff --git a/src/mm-types.h b/src/mm-types.h +new file mode 100644 +index 0000000..4c6e514 +--- /dev/null ++++ b/src/mm-types.h +@@ -0,0 +1,18 @@ ++/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */ ++ ++#ifndef MM_TYPES_H ++#define MM_TYPES_H ++ ++#define MM_DBUS_SERVICE "org.freedesktop.ModemManager" ++#define MM_DBUS_INTERFACE_MODEM_GSM "org.freedesktop.ModemManager.Modem.Gsm" ++ ++enum { ++ MM_GSM_MODEM_REG_STATUS_IDLE = 0, ++ MM_GSM_MODEM_REG_STATUS_HOME = 1, ++ MM_GSM_MODEM_REG_STATUS_SEARCHING = 2, ++ MM_GSM_MODEM_REG_STATUS_DENIED = 3, ++ MM_GSM_MODEM_REG_STATUS_UNKNOWN = 4, ++ MM_GSM_MODEM_REG_STATUS_ROAMING = 5 ++}; ++ ++#endif /* MM_TYPES_H */ +diff --git a/src/nma-gsm-modem.c b/src/nma-gsm-modem.c +new file mode 100644 +index 0000000..584090b +--- /dev/null ++++ b/src/nma-gsm-modem.c +@@ -0,0 +1,198 @@ ++/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */ ++ ++#include "nma-gsm-modem.h" ++#include "mm-types.h" ++ ++G_DEFINE_TYPE (NMAGsmModem, nma_gsm_modem, G_TYPE_OBJECT) ++ ++#define NMA_GSM_MODEM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NMA_TYPE_GSM_MODEM, NMAGsmModemPrivate)) ++ ++typedef struct { ++ DBusGProxy *proxy; ++ int signal_quality; ++ ++ gboolean disposed; ++} NMAGsmModemPrivate; ++ ++enum { ++ SIGNAL_QUALITY, ++ NETWORK_MODE, ++ ++ LAST_SIGNAL ++}; ++ ++static guint signals[LAST_SIGNAL] = { 0 }; ++ ++static void ++signal_quality_proxy (DBusGProxy *proxy, ++ guint32 signal_quality, ++ gpointer user_data) ++{ ++ NMAGsmModem *modem = NMA_GSM_MODEM (user_data); ++ ++ NMA_GSM_MODEM_GET_PRIVATE (modem)->signal_quality = signal_quality; ++ ++ g_signal_emit (modem, signals[SIGNAL_QUALITY], 0, signal_quality); ++} ++ ++static void ++network_mode_proxy (DBusGProxy *proxy, ++ guint32 network_mode, ++ gpointer user_data) ++{ ++ NMAGsmModem *modem = NMA_GSM_MODEM (user_data); ++ ++ g_signal_emit (modem, signals[NETWORK_MODE], 0, network_mode); ++} ++ ++NMAGsmModem * ++nma_gsm_modem_new (DBusGConnection *bus, const char *object_path) ++{ ++ NMAGsmModem *modem; ++ NMAGsmModemPrivate *priv; ++ ++ g_return_val_if_fail (bus != NULL, NULL); ++ g_return_val_if_fail (object_path != NULL, NULL); ++ ++ modem = (NMAGsmModem *) g_object_new (NMA_TYPE_GSM_MODEM, NULL); ++ if (!modem) ++ return NULL; ++ ++ priv = NMA_GSM_MODEM_GET_PRIVATE (modem); ++ priv->proxy = dbus_g_proxy_new_for_name (bus, MM_DBUS_SERVICE, object_path, MM_DBUS_INTERFACE_MODEM_GSM); ++ ++ dbus_g_proxy_add_signal (priv->proxy, "SignalQuality", G_TYPE_UINT, G_TYPE_INVALID); ++ dbus_g_proxy_connect_signal (priv->proxy, "SignalQuality", ++ G_CALLBACK (signal_quality_proxy), ++ modem, ++ NULL); ++ ++ dbus_g_proxy_add_signal (priv->proxy, "NetworkMode", G_TYPE_UINT, G_TYPE_INVALID); ++ dbus_g_proxy_connect_signal (priv->proxy, "NetworkMode", ++ G_CALLBACK (network_mode_proxy), ++ modem, ++ NULL); ++ ++ return modem; ++} ++ ++guint32 ++nma_gsm_modem_get_signal_quality (NMAGsmModem *modem) ++{ ++ NMAGsmModemPrivate *priv = NMA_GSM_MODEM_GET_PRIVATE (modem); ++ GError *err = NULL; ++ ++ g_return_val_if_fail (NMA_IS_GSM_MODEM (modem), 0); ++ ++ if (priv->signal_quality == -1) { ++ if (dbus_g_proxy_call (priv->proxy, "GetSignalQuality", &err, ++ G_TYPE_INVALID, ++ G_TYPE_UINT, &priv->signal_quality, ++ G_TYPE_INVALID)) { ++ g_warning ("Error in getting signal quality: %s", err->message); ++ g_error_free (err); ++ } ++ } ++ ++ return priv->signal_quality; ++} ++ ++guint32 ++nma_gsm_modem_get_registration_info (NMAGsmModem *modem, ++ char **operator_code, ++ char **operator_name) ++{ ++ NMAGsmModemPrivate *priv = NMA_GSM_MODEM_GET_PRIVATE (modem); ++ GError *err = NULL; ++ guint32 status = MM_GSM_MODEM_REG_STATUS_UNKNOWN; ++ ++ g_return_val_if_fail (NMA_IS_GSM_MODEM (modem), 0); ++ ++ if (!dbus_g_proxy_call (priv->proxy, "GetRegistrationInfo", &err, ++ G_TYPE_INVALID, ++ G_TYPE_UINT, &status, ++ G_TYPE_STRING, operator_code, ++ G_TYPE_STRING, operator_name, ++ G_TYPE_INVALID)) { ++ g_warning ("Error in getting network mode: %s", err->message); ++ g_error_free (err); ++ } ++ ++ return status; ++} ++ ++guint32 ++nma_gsm_modem_get_network_mode (NMAGsmModem *modem) ++{ ++ NMAGsmModemPrivate *priv = NMA_GSM_MODEM_GET_PRIVATE (modem); ++ GError *err = NULL; ++ guint32 network_mode = 0; ++ ++ g_return_val_if_fail (NMA_IS_GSM_MODEM (modem), 0); ++ ++ if (!dbus_g_proxy_call (priv->proxy, "GetNetworkMode", &err, ++ G_TYPE_INVALID, ++ G_TYPE_UINT, &network_mode, ++ G_TYPE_INVALID)) { ++ g_warning ("Error in getting network mode: %s", err->message); ++ g_error_free (err); ++ } ++ ++ return network_mode; ++} ++ ++static void ++nma_gsm_modem_init (NMAGsmModem *modem) ++{ ++ NMAGsmModemPrivate *priv = NMA_GSM_MODEM_GET_PRIVATE (modem); ++ ++ priv->signal_quality = -1; ++} ++ ++static void ++dispose (GObject *object) ++{ ++ NMAGsmModemPrivate *priv = NMA_GSM_MODEM_GET_PRIVATE (object); ++ ++ if (priv->disposed) ++ return; ++ ++ priv->disposed = TRUE; ++ ++ if (priv->proxy) ++ g_object_unref (priv->proxy); ++ ++ G_OBJECT_CLASS (nma_gsm_modem_parent_class)->dispose (object); ++} ++ ++static void ++nma_gsm_modem_class_init (NMAGsmModemClass *modem_class) ++{ ++ GObjectClass *object_class = G_OBJECT_CLASS (modem_class); ++ ++ g_type_class_add_private (modem_class, sizeof (NMAGsmModemPrivate)); ++ ++ /* virtual methods */ ++ object_class->dispose = dispose; ++ ++ /* Signals */ ++ signals[SIGNAL_QUALITY] = ++ g_signal_new ("signal-quality", ++ G_OBJECT_CLASS_TYPE (object_class), ++ G_SIGNAL_RUN_FIRST, ++ G_STRUCT_OFFSET (NMAGsmModemClass, signal_quality), ++ NULL, NULL, ++ g_cclosure_marshal_VOID__UINT, ++ G_TYPE_NONE, 1, ++ G_TYPE_UINT); ++ ++ signals[NETWORK_MODE] = ++ g_signal_new ("network-mode", ++ G_OBJECT_CLASS_TYPE (object_class), ++ G_SIGNAL_RUN_FIRST, ++ G_STRUCT_OFFSET (NMAGsmModemClass, network_mode), ++ NULL, NULL, ++ g_cclosure_marshal_VOID__UINT, ++ G_TYPE_NONE, 1, ++ G_TYPE_UINT); ++} +diff --git a/src/nma-gsm-modem.h b/src/nma-gsm-modem.h +new file mode 100644 +index 0000000..90e7ae0 +--- /dev/null ++++ b/src/nma-gsm-modem.h +@@ -0,0 +1,45 @@ ++/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */ ++ ++#ifndef NMA_GSM_MODEM_H ++#define NMA_GSM_MODEM_H ++ ++#include <glib/gtypes.h> ++#include <glib-object.h> ++#include <dbus/dbus-glib.h> ++ ++G_BEGIN_DECLS ++ ++#define NMA_TYPE_GSM_MODEM (nma_gsm_modem_get_type ()) ++#define NMA_GSM_MODEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMA_TYPE_GSM_MODEM, NMAGsmModem)) ++#define NMA_GSM_MODEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NMA_TYPE_GSM_MODEM, NMAGsmModemClass)) ++#define NMA_IS_GSM_MODEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NMA_TYPE_GSM_MODEM)) ++#define NMA_IS_GSM_MODEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), NMA_TYPE_GSM_MODEM)) ++#define NMA_GSM_MODEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NMA_TYPE_GSM_MODEM, NMAGsmModemClass)) ++ ++typedef struct { ++ GObject parent; ++} NMAGsmModem; ++ ++typedef struct { ++ GObjectClass parent; ++ ++ /* Signals */ ++ void (*signal_quality) (NMAGsmModem *modem, guint32 signal_quality); ++ void (*network_mode) (NMAGsmModem *modem, guint32 network_mode); ++} NMAGsmModemClass; ++ ++GType nma_gsm_modem_get_type (void); ++ ++NMAGsmModem *nma_gsm_modem_new (DBusGConnection *bus, ++ const char *object_path); ++ ++guint32 nma_gsm_modem_get_signal_quality (NMAGsmModem *modem); ++guint32 nma_gsm_modem_get_registration_info (NMAGsmModem *modem, ++ char **operator_code, ++ char **operator_name); ++ ++guint32 nma_gsm_modem_get_network_mode (NMAGsmModem *modem); ++ ++G_END_DECLS ++ ++#endif /* NMA_GSM_MODEM_H */ |