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.
This commit is contained in:
+13
-4
@@ -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
|
||||
|
||||
+23
-7
@@ -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
|
||||
|
||||
+105
-3
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+25
-5
@@ -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);
|
||||
|
||||
+1
-1
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user