Update the patches for NetworkManager and nm-applet.

Implement modem properties dialog for the applet which shows all sorts of
information about the modem, allows to scan for visible networks and create
NMConnections based on scan results.
This commit is contained in:
Tambet Ingo
2008-09-12 17:05:43 +03:00
parent 567278d19d
commit b4176325e5
3 changed files with 1620 additions and 443 deletions

View File

@@ -1,8 +1,8 @@
diff --git a/configure.in b/configure.in diff --git a/configure.in b/configure.in
index 9f7db7c..bee43d8 100644 index bd86fc2..fdc4369 100644
--- a/configure.in --- a/configure.in
+++ b/configure.in +++ b/configure.in
@@ -444,6 +444,7 @@ src/dhcp-manager/Makefile @@ -477,6 +477,7 @@ src/dhcp-manager/Makefile
src/supplicant-manager/Makefile src/supplicant-manager/Makefile
src/ppp-manager/Makefile src/ppp-manager/Makefile
src/dnsmasq-manager/Makefile src/dnsmasq-manager/Makefile
@@ -890,10 +890,10 @@ index 0000000..9b16b0b
+#endif /* NM_GSM_MODEM_HSO_H */ +#endif /* NM_GSM_MODEM_HSO_H */
diff --git a/src/modem-manager/nm-gsm-modem.c b/src/modem-manager/nm-gsm-modem.c diff --git a/src/modem-manager/nm-gsm-modem.c b/src/modem-manager/nm-gsm-modem.c
new file mode 100644 new file mode 100644
index 0000000..0b75e6c index 0000000..271e23f
--- /dev/null --- /dev/null
+++ b/src/modem-manager/nm-gsm-modem.c +++ b/src/modem-manager/nm-gsm-modem.c
@@ -0,0 +1,316 @@ @@ -0,0 +1,329 @@
+/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */ +/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */
+ +
+#include <string.h> +#include <string.h>
@@ -981,20 +981,33 @@ index 0000000..0b75e6c
+ dbus_g_proxy_end_call (proxy, call_id, &error, G_TYPE_INVALID); + dbus_g_proxy_end_call (proxy, call_id, &error, G_TYPE_INVALID);
+ +
+ if (error) { + if (error) {
+ if (dbus_g_error_has_name (error, MM_MODEM_ERROR_PIN_NEEDED)) { + g_debug ("%s", dbus_g_error_get_name (error));
+
+ if (dbus_g_error_has_name (error, MM_MODEM_ERROR_SIM_PIN)) {
+ secret = setting->pin; + secret = setting->pin;
+ secret_name = NM_SETTING_GSM_PIN; + secret_name = NM_SETTING_GSM_PIN;
+ priv->modem_state = MODEM_STATE_SET_PIN; + priv->modem_state = MODEM_STATE_SET_PIN;
+ } else if (dbus_g_error_has_name (error, MM_MODEM_ERROR_PUK_NEEDED)) { + } else if (dbus_g_error_has_name (error, MM_MODEM_ERROR_SIM_PUK)) {
+ secret = setting->puk; + secret = setting->puk;
+ secret_name = NM_SETTING_GSM_PUK; + secret_name = NM_SETTING_GSM_PUK;
+ priv->modem_state = MODEM_STATE_SET_PIN; + priv->modem_state = MODEM_STATE_SET_PIN;
+ } else if (dbus_g_error_has_name (error, MM_MODEM_ERROR_INVALID_SECRET)) { + } else if (dbus_g_error_has_name (error, MM_MODEM_ERROR_SIM_WRONG)) {
+ g_free (setting->pin); + g_free (setting->pin);
+ setting->pin = NULL; + setting->pin = NULL;
+ secret_name = NM_SETTING_GSM_PIN; + secret_name = NM_SETTING_GSM_PIN;
+ retry_secret = TRUE; + retry_secret = TRUE;
+ priv->modem_state = MODEM_STATE_SET_PIN; + priv->modem_state = MODEM_STATE_SET_PIN;
+ }
+
+ /* FIXME: Hacks to ignore failures of setting band and network mode for now
+ since only Huawei module supports it. Remove when ModemManager rules.
+ */
+ else if (dbus_g_error_has_name (error, MM_MODEM_ERROR_OPERATION_NOT_SUPPORTED) &&
+ (priv->modem_state == MODEM_STATE_SET_BAND ||
+ priv->modem_state == MODEM_STATE_SET_NETWORK_MODE)) {
+
+ nm_warning ("Modem does not support setting %s, ignoring",
+ priv->modem_state == MODEM_STATE_SET_BAND ? "band" : "network mode");
+ } else { + } else {
+ priv->modem_state = MODEM_STATE_FAILED; + priv->modem_state = MODEM_STATE_FAILED;
+ nm_warning ("GSM modem connection failed: %s", error->message); + nm_warning ("GSM modem connection failed: %s", error->message);
@@ -1019,7 +1032,7 @@ index 0000000..0b75e6c
+ if (secret) { + if (secret) {
+ priv->modem_state = MODEM_STATE_ENABLE; + priv->modem_state = MODEM_STATE_ENABLE;
+ dbus_g_proxy_begin_call (get_proxy (modem, MM_DBUS_INTERFACE_MODEM_GSM_CARD), + dbus_g_proxy_begin_call (get_proxy (modem, MM_DBUS_INTERFACE_MODEM_GSM_CARD),
+ "SetPin", state_machine, + "SendPin", state_machine,
+ modem, NULL, + modem, NULL,
+ G_TYPE_STRING, secret, + G_TYPE_STRING, secret,
+ G_TYPE_INVALID); + G_TYPE_INVALID);
@@ -1254,10 +1267,10 @@ index 0000000..8df8265
+#endif /* NM_GSM_MODEM_H */ +#endif /* NM_GSM_MODEM_H */
diff --git a/src/modem-manager/nm-modem-device.c b/src/modem-manager/nm-modem-device.c diff --git a/src/modem-manager/nm-modem-device.c b/src/modem-manager/nm-modem-device.c
new file mode 100644 new file mode 100644
index 0000000..0a198f7 index 0000000..c5ea8c6
--- /dev/null --- /dev/null
+++ b/src/modem-manager/nm-modem-device.c +++ b/src/modem-manager/nm-modem-device.c
@@ -0,0 +1,464 @@ @@ -0,0 +1,467 @@
+/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */ +/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */
+ +
+#include <string.h> +#include <string.h>
@@ -1566,6 +1579,9 @@ index 0000000..0a198f7
+ /* Make sure we don't leave the serial device open */ + /* Make sure we don't leave the serial device open */
+ switch (new_state) { + switch (new_state) {
+ case NM_DEVICE_STATE_NEED_AUTH: + case NM_DEVICE_STATE_NEED_AUTH:
+ if (priv->ppp_manager)
+ break;
+ /* else fall through */
+ case NM_DEVICE_STATE_UNMANAGED: + case NM_DEVICE_STATE_UNMANAGED:
+ case NM_DEVICE_STATE_UNAVAILABLE: + case NM_DEVICE_STATE_UNAVAILABLE:
+ case NM_DEVICE_STATE_FAILED: + case NM_DEVICE_STATE_FAILED:
@@ -2230,10 +2246,10 @@ index 0000000..ec62f84
+#endif /* NM_MODEM_MANAGER_H */ +#endif /* NM_MODEM_MANAGER_H */
diff --git a/src/modem-manager/nm-modem-types.h b/src/modem-manager/nm-modem-types.h diff --git a/src/modem-manager/nm-modem-types.h b/src/modem-manager/nm-modem-types.h
new file mode 100644 new file mode 100644
index 0000000..bd76796 index 0000000..f5cbe10
--- /dev/null --- /dev/null
+++ b/src/modem-manager/nm-modem-types.h +++ b/src/modem-manager/nm-modem-types.h
@@ -0,0 +1,25 @@ @@ -0,0 +1,89 @@
+/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */ +/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */
+ +
+#ifndef NM_MODEM_TYPES_H +#ifndef NM_MODEM_TYPES_H
@@ -2253,10 +2269,74 @@ index 0000000..bd76796
+#define MM_MODEM_TYPE_GSM 1 +#define MM_MODEM_TYPE_GSM 1
+#define MM_MODEM_TYPE_CDMA 2 +#define MM_MODEM_TYPE_CDMA 2
+ +
+#define MM_MODEM_ERROR_GENERAL MM_DBUS_INTERFACE_MODEM ".GeneralError" +/* Errors */
+#define MM_MODEM_ERROR_PIN_NEEDED MM_DBUS_INTERFACE_MODEM ".PINNeeded" +
+#define MM_MODEM_ERROR_PUK_NEEDED MM_DBUS_INTERFACE_MODEM ".PUKNeeded" +#define MM_SERIAL_OPEN_FAILED MM_DBUS_INTERFACE_MODEM ".SerialOpenFailed"
+#define MM_MODEM_ERROR_INVALID_SECRET MM_DBUS_INTERFACE_MODEM ".InvalidSecret" +#define MM_SERIAL_SEND_FAILED MM_DBUS_INTERFACE_MODEM ".SerialSendFailed"
+#define MM_SERIAL_RESPONSE_TIMEOUT MM_DBUS_INTERFACE_MODEM ".SerialResponseTimeout"
+
+#define MM_MODEM_ERROR_GENERAL MM_DBUS_INTERFACE_MODEM ".General"
+#define MM_MODEM_ERROR_OPERATION_NOT_SUPPORTED MM_DBUS_INTERFACE_MODEM ".OperationNotSupported"
+
+#define MM_MODEM_CONNECT_ERROR_NO_CARRIER MM_DBUS_INTERFACE_MODEM ".NoCarrier"
+#define MM_MODEM_CONNECT_ERROR_NO_DIALTONE MM_DBUS_INTERFACE_MODEM ".NoDialtone"
+#define MM_MODEM_CONNECT_ERROR_BUSY MM_DBUS_INTERFACE_MODEM ".Busy"
+#define MM_MODEM_CONNECT_ERROR_NO_ANSWER MM_DBUS_INTERFACE_MODEM ".NoAnswer"
+
+#define MM_MODEM_ERROR "org.freedesktop.ModemManager.Modem.Gsm"
+
+#define MM_MODEM_ERROR_PHONE_FAILURE MM_MODEM_ERROR ".PhoneFailure"
+#define MM_MODEM_ERROR_NO_CONNECTION MM_MODEM_ERROR ".NoConnection"
+#define MM_MODEM_ERROR_LINK_RESERVED MM_MODEM_ERROR ".LinkReserved"
+#define MM_MODEM_ERROR_NOT_ALLOWED MM_MODEM_ERROR ".OperationNotAllowed"
+#define MM_MODEM_ERROR_NOT_SUPPORTED MM_MODEM_ERROR ".OperationNotSupported"
+#define MM_MODEM_ERROR_PH_SIM_PIN MM_MODEM_ERROR ".PhSimPinRequired"
+#define MM_MODEM_ERROR_PH_FSIM_PIN MM_MODEM_ERROR ".PhFSimPinRequired"
+#define MM_MODEM_ERROR_PH_FSIM_PUK MM_MODEM_ERROR ".PhFPukRequired"
+#define MM_MODEM_ERROR_SIM_NOT_INSERTED MM_MODEM_ERROR ".SimNotInserted"
+#define MM_MODEM_ERROR_SIM_PIN MM_MODEM_ERROR ".SimPinRequired"
+#define MM_MODEM_ERROR_SIM_PUK MM_MODEM_ERROR ".SimPukRequired"
+#define MM_MODEM_ERROR_SIM_FAILURE MM_MODEM_ERROR ".SimFailure"
+#define MM_MODEM_ERROR_SIM_BUSY MM_MODEM_ERROR ".SimBusy"
+#define MM_MODEM_ERROR_SIM_WRONG MM_MODEM_ERROR ".SimWrong"
+#define MM_MODEM_ERROR_WRONG_PASSWORD MM_MODEM_ERROR ".IncorrectPassword"
+#define MM_MODEM_ERROR_SIM_PIN2 MM_MODEM_ERROR ".SimPin2Required"
+#define MM_MODEM_ERROR_SIM_PUK2 MM_MODEM_ERROR ".SimPuk2Required"
+#define MM_MODEM_ERROR_MEMORY_FULL MM_MODEM_ERROR ".MemoryFull"
+#define MM_MODEM_ERROR_INVALID_INDEX MM_MODEM_ERROR ".InvalidIndex"
+#define MM_MODEM_ERROR_NOT_FOUND MM_MODEM_ERROR ".NotFound"
+#define MM_MODEM_ERROR_MEMORY_FAILURE MM_MODEM_ERROR ".MemoryFailure"
+#define MM_MODEM_ERROR_TEXT_TOO_LONG MM_MODEM_ERROR ".TextTooLong"
+#define MM_MODEM_ERROR_INVALID_CHARS MM_MODEM_ERROR ".InvalidChars"
+#define MM_MODEM_ERROR_DIAL_STRING_TOO_LONG MM_MODEM_ERROR ".DialStringTooLong"
+#define MM_MODEM_ERROR_DIAL_STRING_INVALID MM_MODEM_ERROR ".InvalidDialString"
+#define MM_MODEM_ERROR_NO_NETWORK MM_MODEM_ERROR ".NoNetwork"
+#define MM_MODEM_ERROR_NETWORK_TIMEOUT MM_MODEM_ERROR ".NetworkTimeout"
+#define MM_MODEM_ERROR_NETWORK_NOT_ALLOWED MM_MODEM_ERROR ".NetworkNotAllowed"
+#define MM_MODEM_ERROR_NETWORK_PIN MM_MODEM_ERROR ".NetworkPinRequired"
+#define MM_MODEM_ERROR_NETWORK_PUK MM_MODEM_ERROR ".NetworkPukRequired"
+#define MM_MODEM_ERROR_NETWORK_SUBSET_PIN MM_MODEM_ERROR ".NetworkSubsetPinRequired"
+#define MM_MODEM_ERROR_NETWORK_SUBSET_PUK MM_MODEM_ERROR ".NetworkSubsetPukRequired"
+#define MM_MODEM_ERROR_SERVICE_PIN MM_MODEM_ERROR ".ServicePinRequired"
+#define MM_MODEM_ERROR_SERVICE_PUK MM_MODEM_ERROR ".ServicePukRequired"
+#define MM_MODEM_ERROR_CORP_PIN MM_MODEM_ERROR ".CorporatePinRequired"
+#define MM_MODEM_ERROR_CORP_PUK MM_MODEM_ERROR ".CorporatePukRequired"
+#define MM_MODEM_ERROR_HIDDEN_KEY MM_MODEM_ERROR ".HiddenKeyRequired"
+#define MM_MODEM_ERROR_EAP_NOT_SUPPORTED MM_MODEM_ERROR ".EapMethodNotSupported"
+#define MM_MODEM_ERROR_INCORRECT_PARAMS MM_MODEM_ERROR ".IncorrectParams"
+#define MM_MODEM_ERROR_UNKNOWN MM_MODEM_ERROR ".Unknown"
+#define MM_MODEM_ERROR_GPRS_ILLEGAL_MS MM_MODEM_ERROR ".GprsIllegalMs"
+#define MM_MODEM_ERROR_GPRS_ILLEGAL_ME MM_MODEM_ERROR ".GprsIllegalMe"
+#define MM_MODEM_ERROR_GPRS_SERVICE_NOT_ALLOWED MM_MODEM_ERROR ".GprsServiceNotAllowed"
+#define MM_MODEM_ERROR_GPRS_PLMN_NOT_ALLOWED MM_MODEM_ERROR ".GprsPlmnNotAllowed"
+#define MM_MODEM_ERROR_GPRS_LOCATION_NOT_ALLOWED MM_MODEM_ERROR ".GprsLocationNotAllowed"
+#define MM_MODEM_ERROR_GPRS_ROAMING_NOT_ALLOWED MM_MODEM_ERROR ".GprsRoamingNotAllowed"
+#define MM_MODEM_ERROR_GPRS_OPTION_NOT_SUPPORTED MM_MODEM_ERROR ".GprsOptionNotSupported"
+#define MM_MODEM_ERROR_GPRS_NOT_SUBSCRIBED MM_MODEM_ERROR ".GprsNotSubscribed"
+#define MM_MODEM_ERROR_GPRS_OUT_OF_ORDER MM_MODEM_ERROR ".GprsOutOfOrder"
+#define MM_MODEM_ERROR_GPRS_PDP_AUTH_FAILURE MM_MODEM_ERROR ".GprsPdpAuthFailure"
+#define MM_MODEM_ERROR_GPRS_UNKNOWN MM_MODEM_ERROR ".GprsUnspecified"
+#define MM_MODEM_ERROR_GPRS_INVALID_CLASS MM_MODEM_ERROR ".GprsInvalidClass"
+ +
+#endif /* NM_MODEM_TYPES_H */ +#endif /* NM_MODEM_TYPES_H */
diff --git a/src/nm-cdma-device.c b/src/nm-cdma-device.c diff --git a/src/nm-cdma-device.c b/src/nm-cdma-device.c

View File

@@ -1,427 +0,0 @@
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 1641661..fd2601d 100644
--- a/src/applet-device-gsm.c
+++ b/src/applet-device-gsm.c
@@ -39,6 +39,8 @@
#include "applet.h"
#include "applet-device-gsm.h"
+#include "nma-gsm-modem.h"
+#include "mm-types.h"
#include "utils.h"
typedef struct {
@@ -277,16 +279,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 *
@@ -295,6 +345,7 @@ gsm_get_icon (NMDevice *device,
char **tip,
NMApplet *applet)
{
+ NMAGsmModem *modem;
GdkPixbuf *pixbuf = NULL;
const char *iface;
@@ -311,8 +362,40 @@ gsm_get_icon (NMDevice *device,
*tip = g_strdup_printf (_("Waiting for user authentication 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..a1f9979
--- /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.Network"
+
+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 */

File diff suppressed because it is too large Load Diff