Add a patch for the current nm-applet to make it use ModemManager.

This commit is contained in:
Tambet Ingo
2008-08-22 14:54:42 +03:00
parent 36b1ba72d4
commit fc992ce8ab

View 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 */