diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2011-12-12 20:22:51 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-03-15 14:14:33 +0100 |
commit | 776cc66e2c8cd366a9179d66cd193a1ea09a76ea (patch) | |
tree | 10f73e49987ffde5bb292c9301edac81a13893a4 /src/mm-broadband-modem.c | |
parent | 0793522d287ffd8d37886d927645743d0fec77a0 (diff) |
iface-modem: implement all bearer list operations in the interface
Bearer list operations, except for Bearer creation, are so generic that the
interface itself can implement it for every object implementing the interface.
This implementation is based on a new MMBearerList object.
Diffstat (limited to 'src/mm-broadband-modem.c')
-rw-r--r-- | src/mm-broadband-modem.c | 148 |
1 files changed, 20 insertions, 128 deletions
diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c index fc006015..2af4db6b 100644 --- a/src/mm-broadband-modem.c +++ b/src/mm-broadband-modem.c @@ -31,6 +31,7 @@ #include "mm-iface-modem.h" #include "mm-iface-modem-3gpp.h" #include "mm-bearer.h" +#include "mm-bearer-list.h" #include "mm-sim.h" #include "mm-log.h" #include "mm-modem-helpers.h" @@ -53,6 +54,7 @@ enum { PROP_MODEM_DBUS_SKELETON, PROP_MODEM_3GPP_DBUS_SKELETON, PROP_MODEM_SIM, + PROP_MODEM_BEARER_LIST, PROP_MODEM_STATE, PROP_MODEM_CURRENT_CAPABILITIES, PROP_MODEM_3GPP_REGISTRATION_STATE, @@ -63,10 +65,10 @@ struct _MMBroadbandModemPrivate { GObject *modem_dbus_skeleton; GObject *modem_3gpp_dbus_skeleton; MMSim *modem_sim; + MMBearerList *modem_bearer_list; MMModemState modem_state; MMModemCapability modem_current_capabilities; MMModem3gppRegistrationState modem_3gpp_registration_state; - GList *modem_bearers; /* Modem helpers */ MMModemCharset current_charset; @@ -83,24 +85,20 @@ struct _MMBroadbandModemPrivate { /*****************************************************************************/ /* CREATE BEARER */ -static gchar * +static MMBearer * modem_create_bearer_finish (MMIfaceModem *self, GAsyncResult *res, GError **error) { - GObject *bearer; - gchar *bearer_path = NULL; + MMBearer *bearer; if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error)) return NULL; bearer = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res)); - g_object_get (bearer, - MM_BEARER_PATH, &bearer_path, - NULL); + mm_dbg ("New bearer created at DBus path '%s'", mm_bearer_get_path (bearer)); - mm_dbg ("New bearer created at DBus path '%s'", bearer_path); - return bearer_path; + return g_object_ref (bearer); } static void @@ -109,7 +107,6 @@ modem_create_bearer (MMIfaceModem *self, GAsyncReadyCallback callback, gpointer user_data) { - MMBroadbandModem *broadband = MM_BROADBAND_MODEM (self); GSimpleAsyncResult *result; MMBearer *bearer; GError *error = NULL; @@ -129,129 +126,19 @@ modem_create_bearer (MMIfaceModem *self, return; } - /* Store the bearer */ - broadband->priv->modem_bearers = g_list_prepend (broadband->priv->modem_bearers, - bearer); - /* Set a new ref to the bearer object as result */ result = g_simple_async_result_new (G_OBJECT (self), callback, user_data, modem_create_bearer); g_simple_async_result_set_op_res_gpointer (result, - g_object_ref (bearer), + bearer, (GDestroyNotify)g_object_unref); g_simple_async_result_complete_in_idle (result); g_object_unref (result); } /*****************************************************************************/ -/* DELETE BEARER */ - -static gboolean -modem_delete_bearer_finish (MMIfaceModem *self, - GAsyncResult *res, - GError **error) -{ - return !g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error); -} - -static void -modem_delete_bearer (MMIfaceModem *self, - const gchar *path, - GAsyncReadyCallback callback, - gpointer user_data) -{ - MMBroadbandModem *broadband = MM_BROADBAND_MODEM (self); - GList *l; - - if (!g_str_has_prefix (path, MM_DBUS_BEARER_PREFIX)) { - g_simple_async_report_error_in_idle ( - G_OBJECT (self), - callback, - user_data, - MM_CORE_ERROR, - MM_CORE_ERROR_INVALID_ARGS, - "Cannot delete bearer: invalid path '%s'", - path); - return; - } - - for (l = broadband->priv->modem_bearers; l; l = g_list_next (l)) { - if (g_str_equal (path, mm_bearer_get_path (MM_BEARER (l->data)))) { - GSimpleAsyncResult *result; - - g_object_unref (l->data); - broadband->priv->modem_bearers = - g_list_delete_link (broadband->priv->modem_bearers, l); - - /* Complete successfully */ - mm_dbg ("Bearer at '%s' deleted", path); - result = g_simple_async_result_new (G_OBJECT (self), - callback, - user_data, - modem_delete_bearer); - g_simple_async_result_set_op_res_gboolean (result, TRUE); - g_simple_async_result_complete_in_idle (result); - g_object_unref (result); - return; - } - } - - g_simple_async_report_error_in_idle ( - G_OBJECT (self), - callback, - user_data, - MM_CORE_ERROR, - MM_CORE_ERROR_INVALID_ARGS, - "Cannot delete bearer: path '%s' not found", - path); -} - -/*****************************************************************************/ -/* LIST BEARERS */ - -static GStrv -modem_list_bearers_finish (MMIfaceModem *self, - GAsyncResult *res, - GError **error) -{ - MMBroadbandModem *broadband = MM_BROADBAND_MODEM (self); - GStrv path_list = NULL; - GList *l; - guint i; - - path_list = g_new0 (gchar *, - 1 + g_list_length (broadband->priv->modem_bearers)); - - for (i = 0, l = broadband->priv->modem_bearers; l; l = g_list_next (l)) { - path_list[i++] = g_strdup (mm_bearer_get_path (MM_BEARER (l->data))); - } - - return path_list; -} - -static void -modem_list_bearers (MMIfaceModem *self, - GAsyncReadyCallback callback, - gpointer user_data) -{ - - GSimpleAsyncResult *result; - - /* Complete successfully, we'll build the result in finish() */ - result = g_simple_async_result_new (G_OBJECT (self), - callback, - user_data, - modem_list_bearers); - g_simple_async_result_set_op_res_gboolean (result, TRUE); - g_simple_async_result_complete_in_idle (result); - g_object_unref (result); -} - - - -/*****************************************************************************/ /* CAPABILITIES */ typedef struct { @@ -2581,6 +2468,9 @@ set_property (GObject *object, case PROP_MODEM_SIM: self->priv->modem_sim = g_value_dup_object (value); break; + case PROP_MODEM_BEARER_LIST: + self->priv->modem_bearer_list = g_value_dup_object (value); + break; case PROP_MODEM_STATE: self->priv->modem_state = g_value_get_enum (value); break; @@ -2614,6 +2504,9 @@ get_property (GObject *object, case PROP_MODEM_SIM: g_value_set_object (value, self->priv->modem_sim); break; + case PROP_MODEM_BEARER_LIST: + g_value_set_object (value, self->priv->modem_bearer_list); + break; case PROP_MODEM_STATE: g_value_set_enum (value, self->priv->modem_state); break; @@ -2670,9 +2563,8 @@ dispose (GObject *object) if (self->priv->modem_sim) g_clear_object (&self->priv->modem_sim); - g_list_foreach (self->priv->modem_bearers, (GFunc)g_object_unref, NULL); - g_list_free (self->priv->modem_bearers); - self->priv->modem_bearers = NULL; + if (self->priv->modem_bearer_list) + g_clear_object (&self->priv->modem_bearer_list); G_OBJECT_CLASS (mm_broadband_modem_parent_class)->dispose (object); } @@ -2707,10 +2599,6 @@ iface_modem_init (MMIfaceModem *iface) iface->modem_charset_finish = modem_charset_finish; iface->create_bearer = modem_create_bearer; iface->create_bearer_finish = modem_create_bearer_finish; - iface->delete_bearer = modem_delete_bearer; - iface->delete_bearer_finish = modem_delete_bearer_finish; - iface->list_bearers = modem_list_bearers; - iface->list_bearers_finish = modem_list_bearers_finish; } static void @@ -2779,6 +2667,10 @@ mm_broadband_modem_class_init (MMBroadbandModemClass *klass) MM_IFACE_MODEM_SIM); g_object_class_override_property (object_class, + PROP_MODEM_BEARER_LIST, + MM_IFACE_MODEM_BEARER_LIST); + + g_object_class_override_property (object_class, PROP_MODEM_STATE, MM_IFACE_MODEM_STATE); |