aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--nm-applet-r861-use-modem-manager.patch427
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 */