Add a patch for the current nm-applet to make it use ModemManager.
This commit is contained in:
427
nm-applet-r861-use-modem-manager.patch
Normal file
427
nm-applet-r861-use-modem-manager.patch
Normal file
@@ -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 */
|
Reference in New Issue
Block a user