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:
Tambet Ingo
2009-02-06 13:34:02 +02:00
parent 19bd7d7e7f
commit fd5f4222d7
18 changed files with 370 additions and 322 deletions
+1 -6
View File
@@ -41,15 +41,11 @@ libmm_plugin_hso_la_LDFLAGS = -module -avoid-version
# MBM
libmm_plugin_mbm_la_SOURCES = \
mm-modem-gsm-mbm-glue.h \
mm-modem-mbm.c \
mm-modem-mbm.h \
mm-plugin-mbm.c \
mm-plugin-mbm.h
mm-modem-gsm-mbm-glue.h: $(top_srcdir)/introspection/mm-modem-gsm-mbm.xml
dbus-binding-tool --prefix=mm_modem_gsm_mbm --mode=glib-server --output=$@ $<
libmm_plugin_mbm_la_CPPFLAGS = \
$(MM_CFLAGS) \
-I$(top_srcdir)/src
@@ -100,7 +96,6 @@ libmm_plugin_novatel_la_LDFLAGS = -module -avoid-version
BUILT_SOURCES = \
mm-modem-gsm-hso-glue.h \
mm-modem-gsm-mbm-glue.h
mm-modem-gsm-hso-glue.h
CLEANFILES = $(BUILT_SOURCES)
+116 -171
View File
@@ -20,9 +20,6 @@ static void impl_hso_authenticate (MMModemHso *self,
const char *password,
DBusGMethodInvocation *context);
static void impl_hso_get_ip4_config (MMModemHso *self,
DBusGMethodInvocation *context);
#include "mm-modem-gsm-hso-glue.h"
static gpointer mm_modem_hso_parent_class = NULL;
@@ -30,7 +27,6 @@ static gpointer mm_modem_hso_parent_class = NULL;
#define MM_MODEM_HSO_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), MM_TYPE_MODEM_HSO, MMModemHsoPrivate))
typedef struct {
char *network_device;
GRegex *connection_enabled_regex;
gpointer std_parser;
@@ -39,13 +35,6 @@ typedef struct {
guint connect_pending_id;
} MMModemHsoPrivate;
enum {
PROP_0,
PROP_NETWORK_DEVICE,
LAST_PROP
};
#define OWANDATA_TAG "_OWANDATA: "
MMModem *
@@ -61,7 +50,9 @@ mm_modem_hso_new (const char *serial_device,
MM_SERIAL_DEVICE, serial_device,
MM_SERIAL_SEND_DELAY, (guint64) 10000,
MM_MODEM_DRIVER, driver,
MM_MODEM_HSO_NETWORK_DEVICE, network_device,
MM_MODEM_DEVICE, network_device,
MM_MODEM_IP_METHOD, MM_MODEM_IP_METHOD_STATIC,
MM_MODEM_TYPE, MM_MODEM_TYPE_GSM,
NULL));
}
@@ -217,96 +208,6 @@ mm_hso_modem_authenticate (MMModemHso *self,
auth_done (MM_SERIAL (self), NULL, NULL, info);
}
static void
free_dns_array (gpointer data)
{
g_array_free ((GArray *) data, TRUE);
}
static void
ip4_config_invoke (MMCallbackInfo *info)
{
MMModemHsoIp4Fn callback = (MMModemHsoIp4Fn) info->callback;
callback (MM_MODEM_HSO (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);
}
static void
get_ip4_config_done (MMSerial *serial,
GString *response,
GError *error,
gpointer user_data)
{
MMCallbackInfo *info = (MMCallbackInfo *) user_data;
char **items, **iter;
GArray *dns_array;
int i;
guint32 tmp;
guint cid;
if (error) {
info->error = g_error_copy (error);
goto out;
} else if (!g_str_has_prefix (response->str, OWANDATA_TAG)) {
info->error = g_error_new_literal (MM_MODEM_ERROR, MM_MODEM_ERROR_GENERAL,
"Retrieving failed: invalid response.");
goto out;
}
cid = hso_get_cid (MM_MODEM_HSO (serial));
dns_array = g_array_sized_new (FALSE, TRUE, sizeof (guint32), 2);
items = g_strsplit (response->str + strlen (OWANDATA_TAG), ", ", 0);
for (iter = items, i = 0; *iter; iter++, i++) {
if (i == 0) { /* CID */
long int tmp;
errno = 0;
tmp = strtol (*iter, NULL, 10);
if (errno != 0 || tmp < 0 || (guint) tmp != cid) {
info->error = g_error_new (MM_MODEM_ERROR, MM_MODEM_ERROR_GENERAL,
"Unknown CID in OWANDATA response (got %d, expected %d)", (guint) tmp, cid);
break;
}
} else if (i == 1) { /* IP address */
if (inet_pton (AF_INET, *iter, &tmp) > 0)
mm_callback_info_set_data (info, "ip4-address", GUINT_TO_POINTER (tmp), NULL);
} else if (i == 3) { /* DNS 1 */
if (inet_pton (AF_INET, *iter, &tmp) > 0)
g_array_append_val (dns_array, tmp);
} else if (i == 4) { /* DNS 2 */
if (inet_pton (AF_INET, *iter, &tmp) > 0)
g_array_append_val (dns_array, tmp);
}
}
g_strfreev (items);
mm_callback_info_set_data (info, "ip4-dns", dns_array, free_dns_array);
out:
mm_callback_info_schedule (info);
}
void
mm_hso_modem_get_ip4_config (MMModemHso *self,
MMModemHsoIp4Fn callback,
gpointer user_data)
{
MMCallbackInfo *info;
char *command;
g_return_if_fail (MM_IS_MODEM_HSO (self));
g_return_if_fail (callback != NULL);
info = mm_callback_info_new_full (MM_MODEM (self), ip4_config_invoke, G_CALLBACK (callback), user_data);
command = g_strdup_printf ("AT_OWANDATA=%d", hso_get_cid (self));
mm_serial_queue_command (MM_SERIAL (self), command, 3, get_ip4_config_done, info);
g_free (command);
}
/*****************************************************************************/
static void
@@ -380,6 +281,105 @@ do_connect (MMModem *modem,
mm_callback_info_schedule (info);
}
static void
free_dns_array (gpointer data)
{
g_array_free ((GArray *) data, TRUE);
}
static void
ip4_config_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);
}
static void
get_ip4_config_done (MMSerial *serial,
GString *response,
GError *error,
gpointer user_data)
{
MMCallbackInfo *info = (MMCallbackInfo *) user_data;
char **items, **iter;
GArray *dns_array;
int i;
guint32 tmp;
guint cid;
if (error) {
info->error = g_error_copy (error);
goto out;
} else if (!g_str_has_prefix (response->str, OWANDATA_TAG)) {
info->error = g_error_new_literal (MM_MODEM_ERROR, MM_MODEM_ERROR_GENERAL,
"Retrieving failed: invalid response.");
goto out;
}
cid = hso_get_cid (MM_MODEM_HSO (serial));
dns_array = g_array_sized_new (FALSE, TRUE, sizeof (guint32), 2);
items = g_strsplit (response->str + strlen (OWANDATA_TAG), ", ", 0);
for (iter = items, i = 0; *iter; iter++, i++) {
if (i == 0) { /* CID */
long int tmp;
errno = 0;
tmp = strtol (*iter, NULL, 10);
if (errno != 0 || tmp < 0 || (guint) tmp != cid) {
info->error = g_error_new (MM_MODEM_ERROR, MM_MODEM_ERROR_GENERAL,
"Unknown CID in OWANDATA response (got %d, expected %d)", (guint) tmp, cid);
break;
}
} else if (i == 1) { /* IP address */
if (inet_pton (AF_INET, *iter, &tmp) > 0)
mm_callback_info_set_data (info, "ip4-address", GUINT_TO_POINTER (tmp), NULL);
} else if (i == 3) { /* DNS 1 */
if (inet_pton (AF_INET, *iter, &tmp) > 0)
g_array_append_val (dns_array, tmp);
} else if (i == 4) { /* DNS 2 */
if (inet_pton (AF_INET, *iter, &tmp) > 0)
g_array_append_val (dns_array, tmp);
}
}
g_strfreev (items);
mm_callback_info_set_data (info, "ip4-dns", dns_array, free_dns_array);
out:
mm_callback_info_schedule (info);
}
static void
get_ip4_config (MMModem *modem,
MMModemIp4Fn callback,
gpointer user_data)
{
MMCallbackInfo *info;
char *command;
info = mm_callback_info_new_full (modem, ip4_config_invoke, G_CALLBACK (callback), user_data);
command = g_strdup_printf ("AT_OWANDATA=%d", hso_get_cid (MM_MODEM_HSO (modem)));
mm_serial_queue_command (MM_SERIAL (modem), command, 3, get_ip4_config_done, info);
g_free (command);
}
static void
disconnect (MMModem *modem,
MMModemFn callback,
gpointer user_data)
{
MMCallbackInfo *info;
info = mm_callback_info_new (modem, callback, user_data);
mm_serial_queue_command (MM_SERIAL (modem), "AT_OWANCALL=1,0,0", 3, NULL, info);
}
/*****************************************************************************/
static void
@@ -410,28 +410,6 @@ impl_hso_authenticate (MMModemHso *self,
mm_hso_modem_authenticate (self, username, password, impl_hso_auth_done, context);
}
static void
impl_hso_ip4_config_done (MMModemHso *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
dbus_g_method_return (context, address, dns);
}
static void
impl_hso_get_ip4_config (MMModemHso *self,
DBusGMethodInvocation *context)
{
mm_hso_modem_get_ip4_config (self, impl_hso_ip4_config_done, context);
}
static void
connection_enabled (const char *str, gpointer data)
{
@@ -566,6 +544,8 @@ modem_init (MMModem *modem_class)
{
modem_class->enable = enable;
modem_class->connect = do_connect;
modem_class->get_ip4_config = get_ip4_config;
modem_class->disconnect = disconnect;
}
static GObject*
@@ -574,7 +554,8 @@ constructor (GType type,
GObjectConstructParam *construct_params)
{
GObject *object;
MMModemHsoPrivate *priv;
char *modem_device;
char *serial_device;
object = G_OBJECT_CLASS (mm_modem_hso_parent_class)->constructor (type,
n_construct_params,
@@ -582,49 +563,24 @@ constructor (GType type,
if (!object)
return NULL;
priv = MM_MODEM_HSO_GET_PRIVATE (object);
/* Make sure both serial device and data device are provided */
g_object_get (object,
MM_MODEM_DEVICE, &modem_device,
MM_SERIAL_DEVICE, &serial_device,
NULL);
if (!priv->network_device) {
if (!modem_device || !serial_device || !strcmp (modem_device, serial_device)) {
g_warning ("No network device provided");
g_object_unref (object);
return NULL;
object = NULL;
}
g_free (modem_device);
g_free (serial_device);
return object;
}
static void
set_property (GObject *object, guint prop_id,
const GValue *value, GParamSpec *pspec)
{
MMModemHsoPrivate *priv = MM_MODEM_HSO_GET_PRIVATE (object);
switch (prop_id) {
case PROP_NETWORK_DEVICE:
/* Construct only */
priv->network_device = g_value_dup_string (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
get_property (GObject *object, guint prop_id,
GValue *value, GParamSpec *pspec)
{
MMModemHsoPrivate *priv = MM_MODEM_HSO_GET_PRIVATE (object);
switch (prop_id) {
case PROP_NETWORK_DEVICE:
g_value_set_string (value, priv->network_device);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
finalize (GObject *object)
{
@@ -633,7 +589,6 @@ finalize (GObject *object)
/* Clear the pending connection if necessary */
connect_pending_done (MM_MODEM_HSO (object));
g_free (priv->network_device);
g_regex_unref (priv->connection_enabled_regex);
mm_serial_parser_v1_destroy (priv->std_parser);
@@ -650,17 +605,7 @@ mm_modem_hso_class_init (MMModemHsoClass *klass)
/* Virtual methods */
object_class->constructor = constructor;
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
/* Properties */
g_object_class_install_property
(object_class, PROP_NETWORK_DEVICE,
g_param_spec_string (MM_MODEM_HSO_NETWORK_DEVICE,
"NetworkDevice",
"Network device",
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
}
GType
-14
View File
@@ -12,8 +12,6 @@
#define MM_IS_MODEM_HSO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MM_TYPE_MODEM_HSO))
#define MM_MODEM_HSO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MM_TYPE_MODEM_HSO, MMModemHsoClass))
#define MM_MODEM_HSO_NETWORK_DEVICE "network-device"
typedef struct {
MMGenericGsm parent;
} MMModemHso;
@@ -22,13 +20,6 @@ typedef struct {
MMGenericGsmClass parent;
} MMModemHsoClass;
typedef void (*MMModemHsoIp4Fn) (MMModemHso *modem,
guint32 address,
GArray *dns,
GError *error,
gpointer user_data);
GType mm_modem_hso_get_type (void);
MMModem *mm_modem_hso_new (const char *serial_device,
@@ -41,9 +32,4 @@ void mm_hso_modem_authenticate (MMModemHso *self,
MMModemFn callback,
gpointer user_data);
void mm_hso_modem_get_ip4_config (MMModemHso *self,
MMModemHsoIp4Fn callback,
gpointer user_data);
#endif /* MM_MODEM_HSO_H */
+2 -1
View File
@@ -47,8 +47,9 @@ mm_modem_huawei_new (const char *data_device,
return MM_MODEM (g_object_new (MM_TYPE_MODEM_HUAWEI,
MM_SERIAL_DEVICE, monitor_device,
MM_MODEM_DATA_DEVICE, data_device,
MM_MODEM_DEVICE, data_device,
MM_MODEM_DRIVER, driver,
MM_MODEM_TYPE, MM_MODEM_TYPE_GSM,
NULL));
}
+15 -56
View File
@@ -48,7 +48,6 @@ static gpointer mm_modem_mbm_parent_class = NULL;
#define MM_MODEM_MBM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), MM_TYPE_MODEM_MBM, MMModemMbmPrivate))
typedef struct {
char *network_device;
GRegex *boot_trig_regex;
GRegex *msg_waiting_regex;
GRegex *ciev_regex;
@@ -56,13 +55,6 @@ typedef struct {
guint32 signal_quality;
} MMModemMbmPrivate;
enum {
PROP_0,
PROP_NETWORK_DEVICE,
LAST_PROP
};
MMModem *
mm_modem_mbm_new (const char *serial_device,
const char *network_device,
@@ -76,7 +68,9 @@ mm_modem_mbm_new (const char *serial_device,
MM_SERIAL_DEVICE, serial_device,
MM_SERIAL_SEND_DELAY, (guint64) 10000,
MM_MODEM_DRIVER, driver,
MM_MODEM_MBM_NETWORK_DEVICE, network_device,
MM_MODEM_DEVICE, network_device,
MM_MODEM_IP_METHOD, MM_MODEM_IP_METHOD_DHCP,
MM_MODEM_TYPE, MM_MODEM_TYPE_GSM,
NULL));
}
@@ -460,7 +454,8 @@ constructor (GType type,
GObjectConstructParam *construct_params)
{
GObject *object;
MMModemMbmPrivate *priv;
char *modem_device;
char *serial_device;
object = G_OBJECT_CLASS (mm_modem_mbm_parent_class)->constructor (type,
n_construct_params,
@@ -468,55 +463,29 @@ constructor (GType type,
if (!object)
return NULL;
priv = MM_MODEM_MBM_GET_PRIVATE (object);
/* Make sure both serial device and data device are provided */
g_object_get (object,
MM_MODEM_DEVICE, &modem_device,
MM_SERIAL_DEVICE, &serial_device,
NULL);
if (!priv->network_device) {
if (!modem_device || !serial_device || !strcmp (modem_device, serial_device)) {
g_warning ("No network device provided");
g_object_unref (object);
return NULL;
object = NULL;
}
g_free (modem_device);
g_free (serial_device);
return object;
}
static void
set_property (GObject *object, guint prop_id,
const GValue *value, GParamSpec *pspec)
{
MMModemMbmPrivate *priv = MM_MODEM_MBM_GET_PRIVATE (object);
switch (prop_id) {
case PROP_NETWORK_DEVICE:
/* Construct only */
priv->network_device = g_value_dup_string (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
get_property (GObject *object, guint prop_id,
GValue *value, GParamSpec *pspec)
{
MMModemMbmPrivate *priv = MM_MODEM_MBM_GET_PRIVATE (object);
switch (prop_id) {
case PROP_NETWORK_DEVICE:
g_value_set_string (value, priv->network_device);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
finalize (GObject *object)
{
MMModemMbmPrivate *priv = MM_MODEM_MBM_GET_PRIVATE (object);
g_free (priv->network_device);
mm_serial_parser_v1_destroy (priv->std_parser);
g_regex_unref (priv->boot_trig_regex);
g_regex_unref (priv->msg_waiting_regex);
@@ -535,17 +504,7 @@ mm_modem_mbm_class_init (MMModemMbmClass *klass)
/* Virtual methods */
object_class->constructor = constructor;
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
/* Properties */
g_object_class_install_property
(object_class, PROP_NETWORK_DEVICE,
g_param_spec_string (MM_MODEM_MBM_NETWORK_DEVICE,
"NetworkDevice",
"Network device",
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
}
GType
-19
View File
@@ -35,8 +35,6 @@
#define MM_IS_MODEM_MBM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MM_TYPE_MODEM_MBM))
#define MM_MODEM_MBM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MM_TYPE_MODEM_MBM, MMModemMbmClass))
#define MM_MODEM_MBM_NETWORK_DEVICE "network-device"
typedef struct {
MMGenericGsm parent;
} MMModemMbm;
@@ -45,27 +43,10 @@ typedef struct {
MMGenericGsmClass parent;
} MMModemMbmClass;
typedef void (*MMModemMbmIp4Fn) (MMModemMbm *modem,
guint32 address,
GArray *dns,
GError *error,
gpointer user_data);
GType mm_modem_mbm_get_type (void);
MMModem *mm_modem_mbm_new (const char *serial_device,
const char *network_device,
const char *driver);
void mm_mbm_modem_authenticate (MMModemMbm *self,
const char *username,
const char *password,
MMModemFn callback,
gpointer user_data);
void mm_mbm_modem_get_ip4_config (MMModemMbm *self,
MMModemMbmIp4Fn callback,
gpointer user_data);
#endif /* MM_MODEM_MBM_H */
+2 -1
View File
@@ -20,6 +20,7 @@ mm_modem_novatel_new (const char *data_device,
return MM_MODEM (g_object_new (MM_TYPE_MODEM_NOVATEL,
MM_SERIAL_DEVICE, data_device,
MM_MODEM_DRIVER, driver,
MM_MODEM_TYPE, MM_MODEM_TYPE_GSM,
NULL));
}
@@ -51,7 +52,7 @@ pin_check_done (MMModem *modem, GError *error, gpointer user_data)
mm_callback_info_schedule (info);
} else
/* Finish the initialization */
mm_serial_queue_command (MM_SERIAL (modem), "Z X4 &C1 +CMEE=1;+CFUN=1", 10, init_modem_done, info);
mm_serial_queue_command (MM_SERIAL (modem), "Z E0 V1 X4 &C1 +CMEE=1;+CFUN=1", 10, init_modem_done, info);
}
static void
+1
View File
@@ -20,6 +20,7 @@ mm_modem_option_new (const char *data_device,
return MM_MODEM (g_object_new (MM_TYPE_MODEM_OPTION,
MM_SERIAL_DEVICE, data_device,
MM_MODEM_DRIVER, driver,
MM_MODEM_TYPE, MM_MODEM_TYPE_GSM,
NULL));
}
+1
View File
@@ -20,6 +20,7 @@ mm_modem_sierra_new (const char *data_device,
return MM_MODEM (g_object_new (MM_TYPE_MODEM_SIERRA,
MM_SERIAL_DEVICE, data_device,
MM_MODEM_DRIVER, driver,
MM_MODEM_TYPE, MM_MODEM_TYPE_GSM,
NULL));
}