diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-generic-cdma.c | 17 | ||||
-rw-r--r-- | src/mm-generic-gsm.c | 30 | ||||
-rw-r--r-- | src/mm-modem.c | 108 | ||||
-rw-r--r-- | src/mm-modem.h | 30 | ||||
-rw-r--r-- | src/mm-serial.h | 2 |
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" |