diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2011-12-02 12:25:53 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-03-15 14:14:32 +0100 |
commit | e1cba4a53365753aa1ecadd06b369b2a43765037 (patch) | |
tree | d2172393813d876eaebba79fc0bcf75504745bac | |
parent | 4f4bb6b54bfd8c0f1f1bed60127fe5d4d5c9af69 (diff) |
broadband-modem: implement bearer creation, deletion and listing
Currently do not limit the number of bearers that can be created.
-rw-r--r-- | src/mm-broadband-modem.c | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c index 5ff90e17..bc638268 100644 --- a/src/mm-broadband-modem.c +++ b/src/mm-broadband-modem.c @@ -29,6 +29,7 @@ #include "mm-broadband-modem.h" #include "mm-iface-modem.h" #include "mm-iface-modem-3gpp.h" +#include "mm-bearer.h" #include "mm-sim.h" #include "mm-log.h" #include "mm-modem-helpers.h" @@ -64,6 +65,7 @@ struct _MMBroadbandModemPrivate { MMModemState modem_state; MMModemCapability modem_current_capabilities; MMModem3gppRegistrationState modem_3gpp_registration_state; + GList *modem_bearers; /* Modem helpers */ MMModemCharset current_charset; @@ -78,6 +80,177 @@ struct _MMBroadbandModemPrivate { }; /*****************************************************************************/ +/* CREATE BEARER */ + +static gchar * +modem_create_bearer_finish (MMIfaceModem *self, + GAsyncResult *res, + GError **error) +{ + GObject *bearer; + gchar *bearer_path = NULL; + + 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'", bearer_path); + return bearer_path; +} + +static void +modem_create_bearer (MMIfaceModem *self, + GVariant *properties, + GAsyncReadyCallback callback, + gpointer user_data) +{ + MMBroadbandModem *broadband = MM_BROADBAND_MODEM (self); + GSimpleAsyncResult *result; + MMBearer *bearer; + GError *error = NULL; + + /* TODO: We'll need to guess the capability of the bearer, based on the + * current capabilities that we handle, and the specific allowed modes + * configured in the modem. Use GSM_UMTS for testing now */ + bearer = mm_bearer_new (MM_BASE_MODEM (self), + properties, + MM_MODEM_CAPABILITY_GSM_UMTS, + &error); + if (!bearer) { + g_simple_async_report_take_gerror_in_idle (G_OBJECT (self), + callback, + user_data, + error); + 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), + (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 { @@ -2534,6 +2707,10 @@ 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; + G_OBJECT_CLASS (mm_broadband_modem_parent_class)->dispose (object); } @@ -2565,6 +2742,12 @@ iface_modem_init (MMIfaceModem *iface) iface->load_supported_charsets_finish = load_supported_charsets_finish; iface->modem_charset = modem_charset; 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 |