diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2011-11-23 10:30:44 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-03-15 14:14:24 +0100 |
commit | 8647f3cbda099547fe02cf072bd0a460882e2a56 (patch) | |
tree | c441bc5391fc885a8aee15793842a1bd639787d7 | |
parent | a3a712f32f1229e92db55e04430422e2a8afdb90 (diff) |
broadband-modem: implement MMIfaceModem interface
Currently just override the interface properties, and launch initialization and
shutdown where appropriate.
-rw-r--r-- | src/mm-broadband-modem.c | 160 |
1 files changed, 144 insertions, 16 deletions
diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c index 61be1b0f..d2de06fc 100644 --- a/src/mm-broadband-modem.c +++ b/src/mm-broadband-modem.c @@ -27,13 +27,28 @@ #include <mm-enums-types.h> #include "mm-broadband-modem.h" +#include "mm-iface-modem.h" +#include "mm-sim.h" #include "mm-errors.h" #include "mm-log.h" -G_DEFINE_TYPE (MMBroadbandModem, mm_broadband_modem, MM_TYPE_BASE_MODEM); +static void iface_modem_init (MMIfaceModem *iface); + +G_DEFINE_TYPE_EXTENDED (MMBroadbandModem, mm_broadband_modem, MM_TYPE_BASE_MODEM, 0, + G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM, iface_modem_init)); + +enum { + PROP_0, + PROP_MODEM_DBUS_SKELETON, + PROP_MODEM_SIM, + PROP_MODEM_STATE, + PROP_LAST +}; struct _MMBroadbandModemPrivate { - gpointer dummy; + GObject *modem_dbus_skeleton; + MMSim *modem_sim; + MMModemState modem_state; }; /*****************************************************************************/ @@ -100,6 +115,35 @@ disable_finish (MMBaseModem *self, /*****************************************************************************/ +static gboolean +initialize_finish (MMBaseModem *self, + GAsyncResult *res, + GError **error) +{ + if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error)) + return FALSE; + + return TRUE; +} + +static void +iface_modem_initialize_ready (MMBroadbandModem *self, + GAsyncResult *result, + GAsyncResult *initialize_result) +{ + GError *error = NULL; + + if (!mm_iface_modem_initialize_finish (MM_IFACE_MODEM (self), + result, + &error)) + g_simple_async_result_take_error (G_SIMPLE_ASYNC_RESULT (initialize_result), error); + else + g_simple_async_result_set_op_res_gboolean (G_SIMPLE_ASYNC_RESULT (initialize_result), TRUE); + + g_simple_async_result_complete (G_SIMPLE_ASYNC_RESULT (initialize_result)); + g_object_unref (initialize_result); +} + static void initialize (MMBaseModem *self, GCancellable *cancellable, @@ -113,20 +157,10 @@ initialize (MMBaseModem *self, user_data, initialize); - g_simple_async_result_set_op_res_gboolean (G_SIMPLE_ASYNC_RESULT (res), TRUE); - g_simple_async_result_complete_in_idle (G_SIMPLE_ASYNC_RESULT (res)); - g_object_unref (res); -} - -static gboolean -initialize_finish (MMBaseModem *self, - GAsyncResult *res, - GError **error) -{ - if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error)) - return FALSE; - - return TRUE; + /* Initialize the Modem interface */ + mm_iface_modem_initialize (MM_IFACE_MODEM (self), + (GAsyncReadyCallback)iface_modem_initialize_ready, + res); } /*****************************************************************************/ @@ -148,12 +182,89 @@ mm_broadband_modem_new (const gchar *device, } static void +set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + MMBroadbandModem *self = MM_BROADBAND_MODEM (object); + + switch (prop_id) { + case PROP_MODEM_DBUS_SKELETON: + self->priv->modem_dbus_skeleton = g_value_dup_object (value); + break; + case PROP_MODEM_SIM: + self->priv->modem_sim = g_value_dup_object (value); + break; + case PROP_MODEM_STATE: + self->priv->modem_state = g_value_get_enum (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) +{ + MMBroadbandModem *self = MM_BROADBAND_MODEM (object); + + switch (prop_id) { + case PROP_MODEM_DBUS_SKELETON: + g_value_set_object (value, self->priv->modem_dbus_skeleton); + break; + case PROP_MODEM_SIM: + g_value_set_object (value, self->priv->modem_sim); + break; + case PROP_MODEM_STATE: + g_value_set_enum (value, self->priv->modem_state); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void mm_broadband_modem_init (MMBroadbandModem *self) { /* Initialize private data */ self->priv = G_TYPE_INSTANCE_GET_PRIVATE ((self), MM_TYPE_BROADBAND_MODEM, MMBroadbandModemPrivate); + self->priv->modem_state = MM_MODEM_STATE_UNKNOWN; +} + +static void +dispose (GObject *object) +{ + MMBroadbandModem *self = MM_BROADBAND_MODEM (object); + GError *error = NULL; + + if (self->priv->modem_dbus_skeleton) { + if (!mm_iface_modem_shutdown (MM_IFACE_MODEM (object), &error)) { + /* TODO: Cancel initialization */ + mm_warn ("couldn't shutdown interface: '%s'", + error ? error->message : "unknown error"); + g_clear_error (&error); + } + + g_clear_object (&self->priv->modem_dbus_skeleton); + } + + if (self->priv->modem_sim) + g_clear_object (&self->priv->modem_sim); + + G_OBJECT_CLASS (mm_broadband_modem_parent_class)->dispose (object); +} + +static void +iface_modem_init (MMIfaceModem *iface) +{ } static void @@ -164,10 +275,27 @@ mm_broadband_modem_class_init (MMBroadbandModemClass *klass) g_type_class_add_private (object_class, sizeof (MMBroadbandModemPrivate)); + /* Virtual methods */ + object_class->set_property = set_property; + object_class->get_property = get_property; + object_class->dispose = dispose; + base_modem_class->initialize = initialize; base_modem_class->initialize_finish = initialize_finish; base_modem_class->enable = enable; base_modem_class->enable_finish = enable_finish; base_modem_class->disable = disable; base_modem_class->disable_finish = disable_finish; + + g_object_class_override_property (object_class, + PROP_MODEM_DBUS_SKELETON, + MM_IFACE_MODEM_DBUS_SKELETON); + + g_object_class_override_property (object_class, + PROP_MODEM_SIM, + MM_IFACE_MODEM_SIM); + + g_object_class_override_property (object_class, + PROP_MODEM_STATE, + MM_IFACE_MODEM_STATE); } |