iface-modem-3gpp: split unsolicited events setup and enabling

Configuring unsolicited events involves:

 * Setup unsolicited events. This handles the setup of the unsolicited message
   handlers in the AT ports, including the setup of the callback to get called
   when the unsolicited messages are received.

 * Enable unsolicited events. This tells the modem to actually send the
   unsolicited messages.

 * Disable unsolicited events. This tells the modem to stop sending unsolicited
   messages.

 * Cleanup unsolicited events. This removes the unsolicited message handlers
   in the AT ports.
This commit is contained in:
Aleksander Morgado
2012-01-22 00:13:43 +01:00
parent 050c30db1c
commit 3acdf7b9b8
2 changed files with 107 additions and 3 deletions

View File

@@ -883,6 +883,7 @@ typedef enum {
DISABLING_STEP_CLEANUP_PS_REGISTRATION,
DISABLING_STEP_CLEANUP_CS_REGISTRATION,
DISABLING_STEP_CLEANUP_UNSOLICITED_REGISTRATION,
DISABLING_STEP_CLEANUP_UNSOLICITED_EVENTS,
DISABLING_STEP_DISABLE_UNSOLICITED_EVENTS,
DISABLING_STEP_LAST
} DisablingStep;
@@ -963,6 +964,8 @@ VOID_REPLY_READY_FN (cleanup_ps_registration,
"cleanup PS registration")
VOID_REPLY_READY_FN (cleanup_cs_registration,
"cleanup CS registration")
VOID_REPLY_READY_FN (cleanup_unsolicited_events,
"cleanup unsolicited events")
VOID_REPLY_READY_FN (disable_unsolicited_events,
"disable unsolicited events")
@@ -1031,6 +1034,26 @@ interface_disabling_step (DisablingContext *ctx)
/* Fall down to next step */
ctx->step++;
case DISABLING_STEP_CLEANUP_UNSOLICITED_EVENTS:
if (G_UNLIKELY (!unsolicited_events_supported_quark))
unsolicited_events_supported_quark = (g_quark_from_static_string (
UNSOLICITED_EVENTS_SUPPORTED_TAG));
/* Only try to disable if supported */
if (GPOINTER_TO_UINT (g_object_get_qdata (G_OBJECT (ctx->self),
unsolicited_events_supported_quark))) {
if (MM_IFACE_MODEM_3GPP_GET_INTERFACE (ctx->self)->cleanup_unsolicited_events &&
MM_IFACE_MODEM_3GPP_GET_INTERFACE (ctx->self)->cleanup_unsolicited_events_finish) {
MM_IFACE_MODEM_3GPP_GET_INTERFACE (ctx->self)->cleanup_unsolicited_events (
ctx->self,
(GAsyncReadyCallback)cleanup_unsolicited_events_ready,
ctx);
return;
}
}
/* Fall down to next step */
ctx->step++;
case DISABLING_STEP_DISABLE_UNSOLICITED_EVENTS:
if (G_UNLIKELY (!unsolicited_events_supported_quark))
unsolicited_events_supported_quark = (g_quark_from_static_string (
@@ -1079,6 +1102,7 @@ static void interface_enabling_step (EnablingContext *ctx);
typedef enum {
ENABLING_STEP_FIRST,
ENABLING_STEP_SETUP_INDICATORS,
ENABLING_STEP_SETUP_UNSOLICITED_EVENTS,
ENABLING_STEP_ENABLE_UNSOLICITED_EVENTS,
ENABLING_STEP_SETUP_UNSOLICITED_REGISTRATION,
ENABLING_STEP_SETUP_CS_REGISTRATION,
@@ -1212,6 +1236,36 @@ enable_unsolicited_events_ready (MMIfaceModem3gpp *self,
interface_enabling_step (ctx);
}
static void
setup_unsolicited_events_ready (MMIfaceModem3gpp *self,
GAsyncResult *res,
EnablingContext *ctx)
{
GError *error = NULL;
MM_IFACE_MODEM_3GPP_GET_INTERFACE (self)->setup_unsolicited_events_finish (self, res, &error);
if (error) {
/* This error shouldn't be treated as critical */
mm_dbg ("Setting up unsolicited events failed: '%s'", error->message);
g_error_free (error);
/* Reset support flag */
g_object_set_qdata (G_OBJECT (self),
unsolicited_events_supported_quark,
GUINT_TO_POINTER (FALSE));
/* If we get an error setting up unsolicited events, don't even bother trying to
* enable them. */
ctx->step = ENABLING_STEP_ENABLE_UNSOLICITED_EVENTS + 1;
interface_enabling_step (ctx);
return;
}
/* Go on to next step */
ctx->step++;
interface_enabling_step (ctx);
}
static void
setup_cs_registration_ready (MMIfaceModem3gpp *self,
GAsyncResult *res,
@@ -1273,7 +1327,24 @@ run_all_registration_checks_ready (MMIfaceModem3gpp *self,
interface_enabling_step (ctx);
}
VOID_REPLY_READY_FN (setup_unsolicited_registration)
static void
setup_unsolicited_registration_ready (MMIfaceModem3gpp *self,
GAsyncResult *res,
EnablingContext *ctx)
{
GError *error = NULL;
MM_IFACE_MODEM_3GPP_GET_INTERFACE (self)->setup_unsolicited_registration_finish (self, res, &error);
if (error) {
g_simple_async_result_take_error (ctx->result, error);
enabling_context_complete_and_free (ctx);
return;
}
/* Go on to next step */
ctx->step++;
interface_enabling_step (ctx);
}
static void
interface_enabling_step (EnablingContext *ctx)
@@ -1313,9 +1384,26 @@ interface_enabling_step (EnablingContext *ctx)
/* Fall down to next step */
ctx->step++;
case ENABLING_STEP_SETUP_UNSOLICITED_EVENTS:
/* Only try to setup unsolicited events if they are supported */
if (GPOINTER_TO_UINT (g_object_get_qdata (G_OBJECT (ctx->self),
unsolicited_events_supported_quark))) {
if (MM_IFACE_MODEM_3GPP_GET_INTERFACE (ctx->self)->setup_unsolicited_events &&
MM_IFACE_MODEM_3GPP_GET_INTERFACE (ctx->self)->setup_unsolicited_events_finish) {
MM_IFACE_MODEM_3GPP_GET_INTERFACE (ctx->self)->setup_unsolicited_events (
ctx->self,
(GAsyncReadyCallback)setup_unsolicited_events_ready,
ctx);
return;
}
}
/* Fall down to next step */
ctx->step++;
case ENABLING_STEP_ENABLE_UNSOLICITED_EVENTS:
if (!GPOINTER_TO_UINT (g_object_get_qdata (G_OBJECT (ctx->self),
unsolicited_events_supported_quark))) {
/* Only try to enable unsolicited events if they are supported */
if (GPOINTER_TO_UINT (g_object_get_qdata (G_OBJECT (ctx->self),
unsolicited_events_supported_quark))) {
if (MM_IFACE_MODEM_3GPP_GET_INTERFACE (ctx->self)->enable_unsolicited_events &&
MM_IFACE_MODEM_3GPP_GET_INTERFACE (ctx->self)->enable_unsolicited_events_finish) {
MM_IFACE_MODEM_3GPP_GET_INTERFACE (ctx->self)->enable_unsolicited_events (

View File

@@ -54,6 +54,14 @@ struct _MMIfaceModem3gpp {
GAsyncResult *res,
GError **error);
/* Asynchronous setting up unsolicited events */
void (*setup_unsolicited_events) (MMIfaceModem3gpp *self,
GAsyncReadyCallback callback,
gpointer user_data);
gboolean (*setup_unsolicited_events_finish) (MMIfaceModem3gpp *self,
GAsyncResult *res,
GError **error);
/* Asynchronous enabling of unsolicited events */
void (*enable_unsolicited_events) (MMIfaceModem3gpp *self,
GAsyncReadyCallback callback,
@@ -62,6 +70,14 @@ struct _MMIfaceModem3gpp {
GAsyncResult *res,
GError **error);
/* Asynchronous cleaning up of unsolicited events */
void (*cleanup_unsolicited_events) (MMIfaceModem3gpp *self,
GAsyncReadyCallback callback,
gpointer user_data);
gboolean (*cleanup_unsolicited_events_finish) (MMIfaceModem3gpp *self,
GAsyncResult *res,
GError **error);
/* Asynchronous disabling of unsolicited events */
void (*disable_unsolicited_events) (MMIfaceModem3gpp *self,
GAsyncReadyCallback callback,