aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2011-11-28 12:13:25 +0100
committerAleksander Morgado <aleksander@lanedo.com>2012-03-15 14:14:28 +0100
commitd2d9251733cc4c8e6b5c10fd79341c2f0be08726 (patch)
treec90b1adee866147c151b6d37803aef9544ddba05 /src
parenta58f95121af8435574b65a2763b445c2e113c07c (diff)
broadband-modem: setup initialization of all interfaces
Diffstat (limited to 'src')
-rw-r--r--src/mm-broadband-modem.c236
1 files changed, 171 insertions, 65 deletions
diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c
index a5d293dd..ad73d232 100644
--- a/src/mm-broadband-modem.c
+++ b/src/mm-broadband-modem.c
@@ -32,6 +32,11 @@
#include "mm-log.h"
#include "mm-modem-helpers.h"
+#define MM_MODEM_CAPABILITY_3GPP \
+ (MM_MODEM_CAPABILITY_GSM_UMTS | \
+ MM_MODEM_CAPABILITY_LTE | \
+ MM_MODEM_CAPABILITY_LTE_ADVANCED)
+
static void iface_modem_init (MMIfaceModem *iface);
G_DEFINE_TYPE_EXTENDED (MMBroadbandModem, mm_broadband_modem, MM_TYPE_BASE_MODEM, 0,
@@ -1085,6 +1090,57 @@ modem_init (MMIfaceModem *self,
/*****************************************************************************/
static gboolean
+disable_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_disable_ready (MMBroadbandModem *self,
+ GAsyncResult *result,
+ GAsyncResult *disable_result)
+{
+ GError *error = NULL;
+
+ if (!mm_iface_modem_disable_finish (MM_IFACE_MODEM (self),
+ result,
+ &error))
+ g_simple_async_result_take_error (G_SIMPLE_ASYNC_RESULT (disable_result), error);
+ else
+ g_simple_async_result_set_op_res_gboolean (G_SIMPLE_ASYNC_RESULT (disable_result), TRUE);
+
+ g_simple_async_result_complete (G_SIMPLE_ASYNC_RESULT (disable_result));
+ g_object_unref (disable_result);
+}
+
+static void
+disable (MMBaseModem *self,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GSimpleAsyncResult *res;
+
+ res = g_simple_async_result_new (G_OBJECT (self),
+ callback,
+ user_data,
+ disable);
+
+ /* Disable the Modem interface */
+ mm_iface_modem_disable (MM_IFACE_MODEM (self),
+ (GAsyncReadyCallback)iface_modem_disable_ready,
+ res);
+}
+
+
+/*****************************************************************************/
+
+static gboolean
enable_finish (MMBaseModem *self,
GAsyncResult *res,
GError **error)
@@ -1134,56 +1190,37 @@ enable (MMBaseModem *self,
/*****************************************************************************/
-static gboolean
-disable_finish (MMBaseModem *self,
- GAsyncResult *res,
- GError **error)
-{
- if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error))
- return FALSE;
+typedef enum {
+ INITIALIZE_STEP_FIRST,
+ INITIALIZE_STEP_IFACE_MODEM,
+ INITIALIZE_STEP_IFACE_3GPP,
+ INITIALIZE_STEP_IFACE_3GPP_USSD,
+ INITIALIZE_STEP_IFACE_CDMA,
+ INITIALIZE_STEP_IFACE_CONTACTS,
+ INITIALIZE_STEP_IFACE_FIRMWARE,
+ INITIALIZE_STEP_IFACE_LOCATION,
+ INITIALIZE_STEP_IFACE_MESSAGING,
+ INITIALIZE_STEP_IFACE_SIMPLE,
+ INITIALIZE_STEP_LAST,
+} InitializeStep;
- return TRUE;
-}
-
-static void
-iface_modem_disable_ready (MMBroadbandModem *self,
- GAsyncResult *result,
- GAsyncResult *disable_result)
-{
- GError *error = NULL;
+typedef struct {
+ MMBroadbandModem *self;
+ GSimpleAsyncResult *result;
+ InitializeStep step;
+} InitializeContext;
- if (!mm_iface_modem_disable_finish (MM_IFACE_MODEM (self),
- result,
- &error))
- g_simple_async_result_take_error (G_SIMPLE_ASYNC_RESULT (disable_result), error);
- else
- g_simple_async_result_set_op_res_gboolean (G_SIMPLE_ASYNC_RESULT (disable_result), TRUE);
-
- g_simple_async_result_complete (G_SIMPLE_ASYNC_RESULT (disable_result));
- g_object_unref (disable_result);
-}
+static void initialize_step (InitializeContext *ctx);
static void
-disable (MMBaseModem *self,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
+initialize_context_complete_and_free (InitializeContext *ctx)
{
- GSimpleAsyncResult *res;
-
- res = g_simple_async_result_new (G_OBJECT (self),
- callback,
- user_data,
- disable);
-
- /* Disable the Modem interface */
- mm_iface_modem_disable (MM_IFACE_MODEM (self),
- (GAsyncReadyCallback)iface_modem_disable_ready,
- res);
+ g_simple_async_result_complete_in_idle (ctx->result);
+ g_object_unref (ctx->result);
+ g_object_unref (ctx->self);
+ g_free (ctx);
}
-/*****************************************************************************/
-
static gboolean
initialize_finish (MMBaseModem *self,
GAsyncResult *res,
@@ -1195,22 +1232,91 @@ initialize_finish (MMBaseModem *self,
return TRUE;
}
+#undef INTERFACE_INIT_READY_FN
+#define INTERFACE_INIT_READY_FN(NAME,TYPE) \
+ static void \
+ NAME##_initialize_ready (MMBroadbandModem *self, \
+ GAsyncResult *result, \
+ InitializeContext *ctx) \
+ { \
+ GError *error = NULL; \
+ \
+ if (!mm_##NAME##_initialize_finish (TYPE (self), \
+ result, \
+ &error)) { \
+ g_simple_async_result_take_error (G_SIMPLE_ASYNC_RESULT (ctx->result), error); \
+ initialize_context_complete_and_free (ctx); \
+ } \
+ \
+ /* Go on to next step */ \
+ ctx->step++; \
+ initialize_step (ctx); \
+ }
+
+INTERFACE_INIT_READY_FN (iface_modem, MM_IFACE_MODEM)
+
static void
-iface_modem_initialize_ready (MMBroadbandModem *self,
- GAsyncResult *result,
- GAsyncResult *initialize_result)
+initialize_step (InitializeContext *ctx)
{
- GError *error = NULL;
+ switch (ctx->step) {
+ case INITIALIZE_STEP_FIRST:
+ /* Fall down to next step */
+ ctx->step++;
+
+ case INITIALIZE_STEP_IFACE_MODEM:
+ /* Initialize the Modem interface */
+ mm_iface_modem_initialize (MM_IFACE_MODEM (ctx->self),
+ (GAsyncReadyCallback)iface_modem_initialize_ready,
+ ctx);
+ return;
- 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);
+ case INITIALIZE_STEP_IFACE_3GPP:
+ if (ctx->self->priv->modem_current_capabilities & MM_MODEM_CAPABILITY_3GPP) {
+ /* TODO: expose the 3GPP interfaces */
+ }
+
+ /* Fall down to next step */
+ ctx->step++;
+
+ case INITIALIZE_STEP_IFACE_3GPP_USSD:
+ /* Fall down to next step */
+ ctx->step++;
+
+ case INITIALIZE_STEP_IFACE_CDMA:
+ if (ctx->self->priv->modem_current_capabilities & MM_MODEM_CAPABILITY_CDMA_EVDO) {
+ /* TODO: Expose the CDMA interface */
+ }
+ /* Fall down to next step */
+ ctx->step++;
- g_simple_async_result_complete (G_SIMPLE_ASYNC_RESULT (initialize_result));
- g_object_unref (initialize_result);
+ case INITIALIZE_STEP_IFACE_CONTACTS:
+ /* Fall down to next step */
+ ctx->step++;
+
+ case INITIALIZE_STEP_IFACE_FIRMWARE:
+ /* Fall down to next step */
+ ctx->step++;
+
+ case INITIALIZE_STEP_IFACE_LOCATION:
+ /* Fall down to next step */
+ ctx->step++;
+
+ case INITIALIZE_STEP_IFACE_MESSAGING:
+ /* Fall down to next step */
+ ctx->step++;
+
+ case INITIALIZE_STEP_IFACE_SIMPLE:
+ /* Fall down to next step */
+ ctx->step++;
+
+ case INITIALIZE_STEP_LAST:
+ /* All initialized without errors! */
+ g_simple_async_result_set_op_res_gboolean (G_SIMPLE_ASYNC_RESULT (ctx->result), TRUE);
+ initialize_context_complete_and_free (ctx);
+ return;
+ }
+
+ g_assert_not_reached ();
}
static void
@@ -1219,17 +1325,17 @@ initialize (MMBaseModem *self,
GAsyncReadyCallback callback,
gpointer user_data)
{
- GSimpleAsyncResult *res;
+ InitializeContext *ctx;
- res = g_simple_async_result_new (G_OBJECT (self),
- callback,
- user_data,
- initialize);
+ ctx = g_new0 (InitializeContext, 1);
+ ctx->self = g_object_ref (self);
+ ctx->result = g_simple_async_result_new (G_OBJECT (self),
+ callback,
+ user_data,
+ initialize);
+ ctx->step = INITIALIZE_STEP_FIRST;
- /* Initialize the Modem interface */
- mm_iface_modem_initialize (MM_IFACE_MODEM (self),
- (GAsyncReadyCallback)iface_modem_initialize_ready,
- res);
+ initialize_step (ctx);
}
/*****************************************************************************/
@@ -1323,7 +1429,7 @@ dispose (GObject *object)
if (self->priv->modem_dbus_skeleton) {
if (!mm_iface_modem_shutdown (MM_IFACE_MODEM (object), &error)) {
- /* TODO: Cancel initialization */
+ /* TODO: Cancel initialization/enabling/disabling, whatever */
mm_warn ("couldn't shutdown interface: '%s'",
error ? error->message : "unknown error");
g_clear_error (&error);