aboutsummaryrefslogtreecommitdiff
path: root/plugins/mm-modem-hso.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/mm-modem-hso.c')
-rw-r--r--plugins/mm-modem-hso.c259
1 files changed, 102 insertions, 157 deletions
diff --git a/plugins/mm-modem-hso.c b/plugins/mm-modem-hso.c
index bd15e36a..bf901056 100644
--- a/plugins/mm-modem-hso.c
+++ b/plugins/mm-modem-hso.c
@@ -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,6 +208,80 @@ mm_hso_modem_authenticate (MMModemHso *self,
auth_done (MM_SERIAL (self), NULL, NULL, info);
}
+/*****************************************************************************/
+
+static void
+pin_check_done (MMModem *modem, GError *error, gpointer user_data)
+{
+ MMCallbackInfo *info = (MMCallbackInfo *) user_data;
+
+ if (error)
+ info->error = g_error_copy (error);
+ mm_callback_info_schedule (info);
+}
+
+static void
+parent_enable_done (MMModem *modem, GError *error, gpointer user_data)
+{
+ MMCallbackInfo *info = (MMCallbackInfo *) user_data;
+
+ if (error) {
+ info->error = g_error_copy (error);
+ mm_callback_info_schedule (info);
+ } else if (GPOINTER_TO_INT (mm_callback_info_get_data (info, "enable")) == FALSE) {
+ /* Disable, we're done */
+ mm_callback_info_schedule (info);
+ } else {
+ /* HSO needs manual PIN checking */
+ mm_generic_gsm_check_pin (MM_GENERIC_GSM (modem), pin_check_done, info);
+ }
+}
+
+static void
+modem_enable_done (MMSerial *serial,
+ GString *response,
+ GError *error,
+ gpointer user_data)
+{
+ MMCallbackInfo *info = (MMCallbackInfo *) user_data;
+ MMModem *parent_modem_iface;
+
+ parent_modem_iface = g_type_interface_peek_parent (MM_MODEM_GET_INTERFACE (serial));
+ parent_modem_iface->enable (MM_MODEM (serial),
+ GPOINTER_TO_INT (mm_callback_info_get_data (info, "enable")),
+ parent_enable_done, info);
+}
+
+static void
+enable (MMModem *modem,
+ gboolean enable,
+ MMModemFn callback,
+ gpointer user_data)
+{
+ MMCallbackInfo *info;
+
+ info = mm_callback_info_new (modem, callback, user_data);
+ mm_callback_info_set_data (info, "enable", GINT_TO_POINTER (enable), NULL);
+
+ if (enable)
+ modem_enable_done (MM_SERIAL (modem), NULL, NULL, info);
+ else
+ mm_serial_queue_command (MM_SERIAL (modem), "AT_OWANCALL=1,0,0", 3, modem_enable_done, info);
+}
+
+static void
+do_connect (MMModem *modem,
+ const char *number,
+ MMModemFn callback,
+ gpointer user_data)
+{
+ MMCallbackInfo *info;
+
+ info = mm_callback_info_new (modem, callback, user_data);
+ mm_callback_info_schedule (info);
+}
+
+
static void
free_dns_array (gpointer data)
{
@@ -226,9 +291,9 @@ free_dns_array (gpointer data)
static void
ip4_config_invoke (MMCallbackInfo *info)
{
- MMModemHsoIp4Fn callback = (MMModemHsoIp4Fn) info->callback;
+ MMModemIp4Fn callback = (MMModemIp4Fn) info->callback;
- callback (MM_MODEM_HSO (info->modem),
+ 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);
@@ -290,94 +355,29 @@ get_ip4_config_done (MMSerial *serial,
mm_callback_info_schedule (info);
}
-void
-mm_hso_modem_get_ip4_config (MMModemHso *self,
- MMModemHsoIp4Fn callback,
- gpointer user_data)
+static void
+get_ip4_config (MMModem *modem,
+ MMModemIp4Fn 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);
+ 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
-pin_check_done (MMModem *modem, GError *error, gpointer user_data)
-{
- MMCallbackInfo *info = (MMCallbackInfo *) user_data;
-
- if (error)
- info->error = g_error_copy (error);
- mm_callback_info_schedule (info);
-}
-
-static void
-parent_enable_done (MMModem *modem, GError *error, gpointer user_data)
-{
- MMCallbackInfo *info = (MMCallbackInfo *) user_data;
-
- if (error) {
- info->error = g_error_copy (error);
- mm_callback_info_schedule (info);
- } else if (GPOINTER_TO_INT (mm_callback_info_get_data (info, "enable")) == FALSE) {
- /* Disable, we're done */
- mm_callback_info_schedule (info);
- } else {
- /* HSO needs manual PIN checking */
- mm_generic_gsm_check_pin (MM_GENERIC_GSM (modem), pin_check_done, info);
- }
-}
-
-static void
-modem_enable_done (MMSerial *serial,
- GString *response,
- GError *error,
- gpointer user_data)
-{
- MMCallbackInfo *info = (MMCallbackInfo *) user_data;
- MMModem *parent_modem_iface;
-
- parent_modem_iface = g_type_interface_peek_parent (MM_MODEM_GET_INTERFACE (serial));
- parent_modem_iface->enable (MM_MODEM (serial),
- GPOINTER_TO_INT (mm_callback_info_get_data (info, "enable")),
- parent_enable_done, info);
-}
-
-static void
-enable (MMModem *modem,
- gboolean enable,
- MMModemFn callback,
- gpointer user_data)
-{
- MMCallbackInfo *info;
-
- info = mm_callback_info_new (modem, callback, user_data);
- mm_callback_info_set_data (info, "enable", GINT_TO_POINTER (enable), NULL);
-
- if (enable)
- modem_enable_done (MM_SERIAL (modem), NULL, NULL, info);
- else
- mm_serial_queue_command (MM_SERIAL (modem), "AT_OWANCALL=1,0,0", 3, modem_enable_done, info);
-}
-
-static void
-do_connect (MMModem *modem,
- const char *number,
+disconnect (MMModem *modem,
MMModemFn callback,
gpointer user_data)
{
MMCallbackInfo *info;
info = mm_callback_info_new (modem, callback, user_data);
- mm_callback_info_schedule (info);
+ mm_serial_queue_command (MM_SERIAL (modem), "AT_OWANCALL=1,0,0", 3, NULL, info);
}
/*****************************************************************************/
@@ -411,28 +411,6 @@ impl_hso_authenticate (MMModemHso *self,
}
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)
{
if (str && strlen (str) == 4) {
@@ -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,50 +563,25 @@ 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;
}
- return object;
-}
+ g_free (modem_device);
+ g_free (serial_device);
-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;
- }
+ return object;
}
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)
{
MMModemHsoPrivate *priv = MM_MODEM_HSO_GET_PRIVATE (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