aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTambet Ingo <tambet@gmail.com>2009-02-06 13:34:02 +0200
committerTambet Ingo <tambet@gmail.com>2009-02-06 13:34:02 +0200
commitfd5f4222d7c18a3279085edd4ca6ed36247923e6 (patch)
treec4bd92fe5296bdda7cd02878835519778bfbcd19 /src
parent19bd7d7e7f9e6128f29de8888ba23071f8f4e4d8 (diff)
Extend org.freedesktop.ModemManager.Modem interface.
* Add IpMethod property with known values ppp (default), static, DHCP. * Rename DataDevice property to Device. * Add GetIP4Config method. It should be implemented only when IpMethod==static. * Update org.freedesktop.ModemManager.Modem.Gsm.Sms interface based on Pablo Martí Gamboa's suggestions. * Adjust MBM and HSO interfaces to take advantage of the generic Modem interface.
Diffstat (limited to 'src')
-rw-r--r--src/mm-generic-cdma.c17
-rw-r--r--src/mm-generic-gsm.c30
-rw-r--r--src/mm-modem.c108
-rw-r--r--src/mm-modem.h30
-rw-r--r--src/mm-serial.h2
5 files changed, 167 insertions, 20 deletions
diff --git a/src/mm-generic-cdma.c b/src/mm-generic-cdma.c
index 6701e407..eb9e25b0 100644
--- a/src/mm-generic-cdma.c
+++ b/src/mm-generic-cdma.c
@@ -27,6 +27,7 @@ mm_generic_cdma_new (const char *serial_device, const char *driver)
return MM_MODEM (g_object_new (MM_TYPE_GENERIC_CDMA,
MM_SERIAL_DEVICE, serial_device,
MM_MODEM_DRIVER, driver,
+ MM_MODEM_TYPE, MM_MODEM_TYPE_CDMA,
NULL));
}
@@ -375,8 +376,9 @@ set_property (GObject *object, guint prop_id,
/* Construct only */
MM_GENERIC_CDMA_GET_PRIVATE (object)->driver = g_value_dup_string (value);
break;
- case MM_MODEM_PROP_DATA_DEVICE:
+ case MM_MODEM_PROP_DEVICE:
case MM_MODEM_PROP_TYPE:
+ case MM_MODEM_PROP_IP_METHOD:
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -389,7 +391,7 @@ get_property (GObject *object, guint prop_id,
GValue *value, GParamSpec *pspec)
{
switch (prop_id) {
- case MM_MODEM_PROP_DATA_DEVICE:
+ case MM_MODEM_PROP_DEVICE:
g_value_set_string (value, mm_serial_get_device (MM_SERIAL (object)));
break;
case MM_MODEM_PROP_DRIVER:
@@ -398,6 +400,9 @@ get_property (GObject *object, guint prop_id,
case MM_MODEM_PROP_TYPE:
g_value_set_uint (value, MM_MODEM_TYPE_CDMA);
break;
+ case MM_MODEM_PROP_IP_METHOD:
+ g_value_set_uint (value, MM_MODEM_IP_METHOD_PPP);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -429,8 +434,8 @@ mm_generic_cdma_class_init (MMGenericCdmaClass *klass)
/* Properties */
g_object_class_override_property (object_class,
- MM_MODEM_PROP_DATA_DEVICE,
- MM_MODEM_DATA_DEVICE);
+ MM_MODEM_PROP_DEVICE,
+ MM_MODEM_DEVICE);
g_object_class_override_property (object_class,
MM_MODEM_PROP_DRIVER,
@@ -439,6 +444,10 @@ mm_generic_cdma_class_init (MMGenericCdmaClass *klass)
g_object_class_override_property (object_class,
MM_MODEM_PROP_TYPE,
MM_MODEM_TYPE);
+
+ g_object_class_override_property (object_class,
+ MM_MODEM_PROP_IP_METHOD,
+ MM_MODEM_IP_METHOD);
}
GType
diff --git a/src/mm-generic-gsm.c b/src/mm-generic-gsm.c
index 56002648..b4475cdc 100644
--- a/src/mm-generic-gsm.c
+++ b/src/mm-generic-gsm.c
@@ -20,6 +20,8 @@ typedef struct {
char *data_device;
char *oper_code;
char *oper_name;
+ guint32 modem_type;
+ guint32 ip_method;
MMModemGsmNetworkRegStatus reg_status;
guint32 signal_quality;
guint32 cid;
@@ -40,6 +42,7 @@ mm_generic_gsm_new (const char *serial_device, const char *driver)
return MM_MODEM (g_object_new (MM_TYPE_GENERIC_GSM,
MM_SERIAL_DEVICE, serial_device,
MM_MODEM_DRIVER, driver,
+ MM_MODEM_TYPE, MM_MODEM_TYPE_GSM,
NULL));
}
@@ -1121,9 +1124,10 @@ simple_state_machine (MMModem *modem, GError *error, gpointer user_data)
gboolean need_pin = FALSE;
if (error) {
- if (state == SIMPLE_STATE_CHECK_PIN && g_error_matches (error, MM_MOBILE_ERROR, MM_MOBILE_ERROR_SIM_PIN))
+ if (state == g_error_matches (error, MM_MOBILE_ERROR, MM_MOBILE_ERROR_SIM_PIN)) {
need_pin = TRUE;
- else {
+ state = SIMPLE_STATE_CHECK_PIN;
+ } else {
info->error = g_error_copy (error);
goto out;
}
@@ -1379,11 +1383,15 @@ set_property (GObject *object, guint prop_id,
/* Construct only */
priv->driver = g_value_dup_string (value);
break;
- case MM_MODEM_PROP_DATA_DEVICE:
+ case MM_MODEM_PROP_DEVICE:
g_free (priv->data_device);
priv->data_device = g_value_dup_string (value);
break;
case MM_MODEM_PROP_TYPE:
+ priv->modem_type = g_value_get_uint (value);
+ break;
+ case MM_MODEM_PROP_IP_METHOD:
+ priv->ip_method = g_value_get_uint (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -1398,7 +1406,7 @@ get_property (GObject *object, guint prop_id,
MMGenericGsmPrivate *priv = MM_GENERIC_GSM_GET_PRIVATE (object);
switch (prop_id) {
- case MM_MODEM_PROP_DATA_DEVICE:
+ case MM_MODEM_PROP_DEVICE:
if (priv->data_device)
g_value_set_string (value, priv->data_device);
else
@@ -1408,7 +1416,10 @@ get_property (GObject *object, guint prop_id,
g_value_set_string (value, MM_GENERIC_GSM_GET_PRIVATE (object)->driver);
break;
case MM_MODEM_PROP_TYPE:
- g_value_set_uint (value, MM_MODEM_TYPE_GSM);
+ g_value_set_uint (value, priv->modem_type);
+ break;
+ case MM_MODEM_PROP_IP_METHOD:
+ g_value_set_uint (value, priv->ip_method);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -1444,8 +1455,8 @@ mm_generic_gsm_class_init (MMGenericGsmClass *klass)
/* Properties */
g_object_class_override_property (object_class,
- MM_MODEM_PROP_DATA_DEVICE,
- MM_MODEM_DATA_DEVICE);
+ MM_MODEM_PROP_DEVICE,
+ MM_MODEM_DEVICE);
g_object_class_override_property (object_class,
MM_MODEM_PROP_DRIVER,
@@ -1454,6 +1465,11 @@ mm_generic_gsm_class_init (MMGenericGsmClass *klass)
g_object_class_override_property (object_class,
MM_MODEM_PROP_TYPE,
MM_MODEM_TYPE);
+
+ g_object_class_override_property (object_class,
+ MM_MODEM_PROP_IP_METHOD,
+ MM_MODEM_IP_METHOD);
+
}
GType
diff --git a/src/mm-modem.c b/src/mm-modem.c
index 88afd9c2..7bf913ec 100644
--- a/src/mm-modem.c
+++ b/src/mm-modem.c
@@ -9,6 +9,7 @@
static void impl_modem_enable (MMModem *modem, gboolean enable, DBusGMethodInvocation *context);
static void impl_modem_connect (MMModem *modem, const char *number, DBusGMethodInvocation *context);
static void impl_modem_disconnect (MMModem *modem, DBusGMethodInvocation *context);
+static void impl_modem_get_ip4_config (MMModem *modem, DBusGMethodInvocation *context);
#include "mm-modem-glue.h"
@@ -83,6 +84,97 @@ impl_modem_connect (MMModem *modem,
mm_modem_connect (modem, number, async_call_done, context);
}
+static void
+get_ip4_invoke (MMCallbackInfo *info)
+{
+ MMModemIp4Fn callback = (MMModemIp4Fn) info->callback;
+
+ callback (info->modem,
+ GPOINTER_TO_UINT (mm_callback_info_get_data (info, "ip4-address")),
+ (GArray *) mm_callback_info_get_data (info, "ip4-dns"),
+ info->error, info->user_data);
+}
+
+void
+mm_modem_get_ip4_config (MMModem *self,
+ MMModemIp4Fn callback,
+ gpointer user_data)
+{
+ g_return_if_fail (MM_IS_MODEM (self));
+ g_return_if_fail (callback != NULL);
+
+ if (MM_MODEM_GET_INTERFACE (self)->get_ip4_config)
+ MM_MODEM_GET_INTERFACE (self)->get_ip4_config (self, callback, user_data);
+ else {
+ MMCallbackInfo *info;
+
+ info = mm_callback_info_new_full (self,
+ get_ip4_invoke,
+ G_CALLBACK (callback),
+ user_data);
+
+ info->error = g_error_new_literal (MM_MODEM_ERROR, MM_MODEM_ERROR_OPERATION_NOT_SUPPORTED,
+ "Operation not supported");
+ mm_callback_info_schedule (info);
+ }
+}
+
+static void
+value_array_add_uint (GValueArray *array, guint32 i)
+{
+ GValue value = { 0, };
+
+ g_value_init (&value, G_TYPE_UINT);
+ g_value_set_uint (&value, i);
+ g_value_array_append (array, &value);
+ g_value_unset (&value);
+}
+
+static void
+get_ip4_done (MMModem *modem,
+ guint32 address,
+ GArray *dns,
+ GError *error,
+ gpointer user_data)
+{
+ DBusGMethodInvocation *context = (DBusGMethodInvocation *) user_data;
+
+ if (error)
+ dbus_g_method_return_error (context, error);
+ else {
+ GValueArray *array;
+ guint32 dns1 = 0;
+ guint32 dns2 = 0;
+ guint32 dns3 = 0;
+
+ array = g_value_array_new (4);
+
+ if (dns) {
+ if (dns->len > 0)
+
+ dns1 = g_array_index (dns, guint32, 0);
+ if (dns->len > 1)
+ dns2 = g_array_index (dns, guint32, 1);
+ if (dns->len > 2)
+ dns3 = g_array_index (dns, guint32, 2);
+ }
+
+ value_array_add_uint (array, address);
+ value_array_add_uint (array, dns1);
+ value_array_add_uint (array, dns2);
+ value_array_add_uint (array, dns3);
+
+ dbus_g_method_return (context, array);
+ }
+}
+
+static void
+impl_modem_get_ip4_config (MMModem *modem,
+ DBusGMethodInvocation *context)
+{
+ mm_modem_get_ip4_config (modem, get_ip4_done, context);
+}
+
void
mm_modem_disconnect (MMModem *self,
MMModemFn callback,
@@ -118,9 +210,9 @@ mm_modem_init (gpointer g_iface)
/* Properties */
g_object_interface_install_property
(g_iface,
- g_param_spec_string (MM_MODEM_DATA_DEVICE,
- "DataDevice",
- "DataDevice",
+ g_param_spec_string (MM_MODEM_DEVICE,
+ "Device",
+ "Device",
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
@@ -140,6 +232,16 @@ mm_modem_init (gpointer g_iface)
0, G_MAXUINT32, 0,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+ g_object_interface_install_property
+ (g_iface,
+ g_param_spec_uint (MM_MODEM_IP_METHOD,
+ "IP method",
+ "IP configuration method",
+ MM_MODEM_IP_METHOD_PPP,
+ MM_MODEM_IP_METHOD_DHCP,
+ MM_MODEM_IP_METHOD_PPP,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+
initialized = TRUE;
}
diff --git a/src/mm-modem.h b/src/mm-modem.h
index fdcce25b..914b86a3 100644
--- a/src/mm-modem.h
+++ b/src/mm-modem.h
@@ -10,19 +10,25 @@
#define MM_IS_MODEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MM_TYPE_MODEM))
#define MM_MODEM_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), MM_TYPE_MODEM, MMModem))
-#define MM_MODEM_DATA_DEVICE "data-device"
-#define MM_MODEM_DRIVER "driver"
-#define MM_MODEM_TYPE "type"
+#define MM_MODEM_DEVICE "device"
+#define MM_MODEM_DRIVER "driver"
+#define MM_MODEM_TYPE "type"
+#define MM_MODEM_IP_METHOD "ip-method"
#define MM_MODEM_TYPE_GSM 1
#define MM_MODEM_TYPE_CDMA 2
+#define MM_MODEM_IP_METHOD_PPP 0
+#define MM_MODEM_IP_METHOD_STATIC 1
+#define MM_MODEM_IP_METHOD_DHCP 2
+
typedef enum {
MM_MODEM_PROP_FIRST = 0x1000,
- MM_MODEM_PROP_DATA_DEVICE = MM_MODEM_PROP_FIRST,
+ MM_MODEM_PROP_DEVICE = MM_MODEM_PROP_FIRST,
MM_MODEM_PROP_DRIVER,
- MM_MODEM_PROP_TYPE
+ MM_MODEM_PROP_TYPE,
+ MM_MODEM_PROP_IP_METHOD,
} MMModemProp;
typedef struct _MMModem MMModem;
@@ -41,6 +47,12 @@ typedef void (*MMModemStringFn) (MMModem *modem,
GError *error,
gpointer user_data);
+typedef void (*MMModemIp4Fn) (MMModem *modem,
+ guint32 address,
+ GArray *dns,
+ GError *error,
+ gpointer user_data);
+
struct _MMModem {
GTypeInterface g_iface;
@@ -55,6 +67,10 @@ struct _MMModem {
MMModemFn callback,
gpointer user_data);
+ void (*get_ip4_config) (MMModem *self,
+ MMModemIp4Fn callback,
+ gpointer user_data);
+
void (*disconnect) (MMModem *self,
MMModemFn callback,
gpointer user_data);
@@ -72,6 +88,10 @@ void mm_modem_connect (MMModem *self,
MMModemFn callback,
gpointer user_data);
+void mm_modem_get_ip4_config (MMModem *self,
+ MMModemIp4Fn callback,
+ gpointer user_data);
+
void mm_modem_disconnect (MMModem *self,
MMModemFn callback,
gpointer user_data);
diff --git a/src/mm-serial.h b/src/mm-serial.h
index eeaac9c1..7d9e6961 100644
--- a/src/mm-serial.h
+++ b/src/mm-serial.h
@@ -13,7 +13,7 @@
#define MM_IS_SERIAL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MM_TYPE_SERIAL))
#define MM_SERIAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MM_TYPE_SERIAL, MMSerialClass))
-#define MM_SERIAL_DEVICE "device"
+#define MM_SERIAL_DEVICE "serial-device"
#define MM_SERIAL_BAUD "baud"
#define MM_SERIAL_BITS "bits"
#define MM_SERIAL_PARITY "parity"