iface-modem-cdma: allow implementations to fully override registration checks

Implementations of the CDMA interface can either:
   * Implement run_registration_checks()
or,
   * Implement the sub-steps of the generic registration checks sequence
This commit is contained in:
Aleksander Morgado
2012-08-08 21:35:23 +02:00
parent 421d423777
commit 05f80036d1
2 changed files with 117 additions and 45 deletions

View File

@@ -406,8 +406,8 @@ mm_iface_modem_cdma_register_in_network (MMIfaceModemCdma *self,
/*****************************************************************************/ /*****************************************************************************/
typedef struct _RunAllRegistrationChecksContext RunAllRegistrationChecksContext; typedef struct _RunRegistrationChecksContext RunRegistrationChecksContext;
static void registration_check_step (RunAllRegistrationChecksContext *ctx); static void registration_check_step (RunRegistrationChecksContext *ctx);
typedef enum { typedef enum {
REGISTRATION_CHECK_STEP_FIRST, REGISTRATION_CHECK_STEP_FIRST,
@@ -425,7 +425,7 @@ typedef enum {
REGISTRATION_CHECK_STEP_LAST, REGISTRATION_CHECK_STEP_LAST,
} RegistrationCheckStep; } RegistrationCheckStep;
struct _RunAllRegistrationChecksContext { struct _RunRegistrationChecksContext {
MMIfaceModemCdma *self; MMIfaceModemCdma *self;
GSimpleAsyncResult *result; GSimpleAsyncResult *result;
RegistrationCheckStep step; RegistrationCheckStep step;
@@ -454,7 +454,7 @@ struct _RunAllRegistrationChecksContext {
}; };
static void static void
run_registration_checks_context_complete_and_free (RunAllRegistrationChecksContext *ctx) run_registration_checks_context_complete_and_free (RunRegistrationChecksContext *ctx)
{ {
g_simple_async_result_complete_in_idle (ctx->result); g_simple_async_result_complete_in_idle (ctx->result);
g_object_unref (ctx->result); g_object_unref (ctx->result);
@@ -473,7 +473,7 @@ mm_iface_modem_cdma_run_registration_checks_finish (MMIfaceModemCdma *self,
static void static void
setup_registration_checks_ready (MMIfaceModemCdma *self, setup_registration_checks_ready (MMIfaceModemCdma *self,
GAsyncResult *res, GAsyncResult *res,
RunAllRegistrationChecksContext *ctx) RunRegistrationChecksContext *ctx)
{ {
GError *error = NULL; GError *error = NULL;
@@ -500,7 +500,7 @@ setup_registration_checks_ready (MMIfaceModemCdma *self,
static void static void
get_call_manager_state_ready (MMIfaceModemCdma *self, get_call_manager_state_ready (MMIfaceModemCdma *self,
GAsyncResult *res, GAsyncResult *res,
RunAllRegistrationChecksContext *ctx) RunRegistrationChecksContext *ctx)
{ {
GError *error = NULL; GError *error = NULL;
@@ -533,7 +533,7 @@ get_call_manager_state_ready (MMIfaceModemCdma *self,
static void static void
get_hdr_state_ready (MMIfaceModemCdma *self, get_hdr_state_ready (MMIfaceModemCdma *self,
GAsyncResult *res, GAsyncResult *res,
RunAllRegistrationChecksContext *ctx) RunRegistrationChecksContext *ctx)
{ {
GError *error = NULL; GError *error = NULL;
@@ -558,7 +558,7 @@ get_hdr_state_ready (MMIfaceModemCdma *self,
} }
static void static void
parse_qcdm_results (RunAllRegistrationChecksContext *ctx) parse_qcdm_results (RunRegistrationChecksContext *ctx)
{ {
/* Set QCDM-obtained registration info */ /* Set QCDM-obtained registration info */
switch (ctx->call_manager_system_mode) { switch (ctx->call_manager_system_mode) {
@@ -594,7 +594,7 @@ parse_qcdm_results (RunAllRegistrationChecksContext *ctx)
static void static void
get_service_status_ready (MMIfaceModemCdma *self, get_service_status_ready (MMIfaceModemCdma *self,
GAsyncResult *res, GAsyncResult *res,
RunAllRegistrationChecksContext *ctx) RunRegistrationChecksContext *ctx)
{ {
GError *error = NULL; GError *error = NULL;
gboolean has_service = FALSE; gboolean has_service = FALSE;
@@ -623,7 +623,7 @@ get_service_status_ready (MMIfaceModemCdma *self,
static void static void
get_cdma1x_serving_system_ready (MMIfaceModemCdma *self, get_cdma1x_serving_system_ready (MMIfaceModemCdma *self,
GAsyncResult *res, GAsyncResult *res,
RunAllRegistrationChecksContext *ctx) RunRegistrationChecksContext *ctx)
{ {
GError *error = NULL; GError *error = NULL;
@@ -657,7 +657,7 @@ get_cdma1x_serving_system_ready (MMIfaceModemCdma *self,
} }
static void static void
parse_at_results (RunAllRegistrationChecksContext *ctx) parse_at_results (RunRegistrationChecksContext *ctx)
{ {
/* 99999 means unknown/no service */ /* 99999 means unknown/no service */
if (ctx->cdma1x_sid == MM_MODEM_CDMA_SID_UNKNOWN && if (ctx->cdma1x_sid == MM_MODEM_CDMA_SID_UNKNOWN &&
@@ -678,7 +678,7 @@ parse_at_results (RunAllRegistrationChecksContext *ctx)
static void static void
get_detailed_registration_state_ready (MMIfaceModemCdma *self, get_detailed_registration_state_ready (MMIfaceModemCdma *self,
GAsyncResult *res, GAsyncResult *res,
RunAllRegistrationChecksContext *ctx) RunRegistrationChecksContext *ctx)
{ {
GError *error = NULL; GError *error = NULL;
MMModemCdmaRegistrationState detailed_cdma1x_state = MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN; MMModemCdmaRegistrationState detailed_cdma1x_state = MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN;
@@ -704,7 +704,7 @@ get_detailed_registration_state_ready (MMIfaceModemCdma *self,
} }
static void static void
registration_check_step (RunAllRegistrationChecksContext *ctx) registration_check_step (RunRegistrationChecksContext *ctx)
{ {
switch (ctx->step) { switch (ctx->step) {
case REGISTRATION_CHECK_STEP_FIRST: case REGISTRATION_CHECK_STEP_FIRST:
@@ -854,36 +854,84 @@ registration_check_step (RunAllRegistrationChecksContext *ctx)
g_assert_not_reached (); g_assert_not_reached ();
} }
static void
custom_run_registration_checks_ready (MMIfaceModemCdma *self,
GAsyncResult *res,
GSimpleAsyncResult *simple)
{
GError *error = NULL;
if (!MM_IFACE_MODEM_CDMA_GET_INTERFACE (self)->run_registration_checks_finish (self, res, &error))
g_simple_async_result_take_error (simple, error);
else
g_simple_async_result_set_op_res_gboolean (simple, TRUE);
g_simple_async_result_complete (simple);
g_object_unref (simple);
}
void void
mm_iface_modem_cdma_run_registration_checks (MMIfaceModemCdma *self, mm_iface_modem_cdma_run_registration_checks (MMIfaceModemCdma *self,
GAsyncReadyCallback callback, GAsyncReadyCallback callback,
gpointer user_data) gpointer user_data)
{ {
RunAllRegistrationChecksContext *ctx; GSimpleAsyncResult *result;
gboolean cdma1x_supported;
gboolean evdo_supported;
ctx = g_new0 (RunAllRegistrationChecksContext, 1); result = g_simple_async_result_new (G_OBJECT (self),
ctx->self = g_object_ref (self); callback,
ctx->result = g_simple_async_result_new (G_OBJECT (self), user_data,
callback, mm_iface_modem_cdma_run_registration_checks);
user_data,
mm_iface_modem_cdma_run_registration_checks);
ctx->cdma1x_state = MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN;
ctx->evdo_state = MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN;
ctx->call_manager_system_mode = QCDM_CMD_CM_SUBSYS_STATE_INFO_SYSTEM_MODE_NO_SERVICE;
ctx->hdr_session_state = QCDM_CMD_HDR_SUBSYS_STATE_INFO_SESSION_STATE_CLOSED;
ctx->hdr_almp_state = QCDM_CMD_HDR_SUBSYS_STATE_INFO_ALMP_STATE_INACTIVE;
ctx->hdr_hybrid_mode = 0;
g_object_get (self, g_object_get (self,
MM_IFACE_MODEM_CDMA_EVDO_NETWORK_SUPPORTED, &ctx->evdo_supported, MM_IFACE_MODEM_CDMA_EVDO_NETWORK_SUPPORTED, &evdo_supported,
MM_IFACE_MODEM_CDMA_CDMA1X_NETWORK_SUPPORTED, &ctx->cdma1x_supported, MM_IFACE_MODEM_CDMA_CDMA1X_NETWORK_SUPPORTED, &cdma1x_supported,
NULL); NULL);
mm_dbg ("Running registration checks (CDMA1x: '%s', EV-DO: '%s')", mm_dbg ("Running registration checks (CDMA1x: '%s', EV-DO: '%s')",
ctx->cdma1x_supported ? "yes" : "no", cdma1x_supported ? "yes" : "no",
ctx->evdo_supported ? "yes" : "no"); evdo_supported ? "yes" : "no");
registration_check_step (ctx); if (MM_IFACE_MODEM_CDMA_GET_INTERFACE (self)->run_registration_checks &&
MM_IFACE_MODEM_CDMA_GET_INTERFACE (self)->run_registration_checks_finish) {
/* Plugins implementing full custom registration checks shouldn't implement
* sub-steps of the generic registration check sequence */
g_warn_if_fail (MM_IFACE_MODEM_CDMA_GET_INTERFACE (self)->setup_registration_checks != NULL);
g_warn_if_fail (MM_IFACE_MODEM_CDMA_GET_INTERFACE (self)->setup_registration_checks_finish != NULL);
g_warn_if_fail (MM_IFACE_MODEM_CDMA_GET_INTERFACE (self)->get_call_manager_state != NULL);
g_warn_if_fail (MM_IFACE_MODEM_CDMA_GET_INTERFACE (self)->get_call_manager_state_finish != NULL);
g_warn_if_fail (MM_IFACE_MODEM_CDMA_GET_INTERFACE (self)->get_hdr_state != NULL);
g_warn_if_fail (MM_IFACE_MODEM_CDMA_GET_INTERFACE (self)->get_hdr_state_finish != NULL);
g_warn_if_fail (MM_IFACE_MODEM_CDMA_GET_INTERFACE (self)->get_service_status != NULL);
g_warn_if_fail (MM_IFACE_MODEM_CDMA_GET_INTERFACE (self)->get_service_status_finish != NULL);
g_warn_if_fail (MM_IFACE_MODEM_CDMA_GET_INTERFACE (self)->get_cdma1x_serving_system != NULL);
g_warn_if_fail (MM_IFACE_MODEM_CDMA_GET_INTERFACE (self)->get_cdma1x_serving_system_finish != NULL);
g_warn_if_fail (MM_IFACE_MODEM_CDMA_GET_INTERFACE (self)->get_detailed_registration_state != NULL);
g_warn_if_fail (MM_IFACE_MODEM_CDMA_GET_INTERFACE (self)->get_detailed_registration_state_finish != NULL);
MM_IFACE_MODEM_CDMA_GET_INTERFACE (self)->run_registration_checks (
self,
cdma1x_supported,
evdo_supported,
(GAsyncReadyCallback)custom_run_registration_checks_ready,
result);
} else {
RunRegistrationChecksContext *ctx;
ctx = g_new0 (RunRegistrationChecksContext, 1);
ctx->self = g_object_ref (self);
ctx->result = result;
ctx->cdma1x_state = MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN;
ctx->evdo_state = MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN;
ctx->call_manager_system_mode = QCDM_CMD_CM_SUBSYS_STATE_INFO_SYSTEM_MODE_NO_SERVICE;
ctx->hdr_session_state = QCDM_CMD_HDR_SUBSYS_STATE_INFO_SESSION_STATE_CLOSED;
ctx->hdr_almp_state = QCDM_CMD_HDR_SUBSYS_STATE_INFO_ALMP_STATE_INACTIVE;
ctx->hdr_hybrid_mode = 0;
ctx->evdo_supported = evdo_supported;
ctx->cdma1x_supported = cdma1x_supported;
registration_check_step (ctx);
}
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@@ -112,6 +112,44 @@ struct _MMIfaceModemCdma {
GAsyncResult *res, GAsyncResult *res,
GError **error); GError **error);
/* Try to register in the CDMA network. This implementation is just making
* sure that the modem is registered, and if it's not it will wait until it
* is.
*/
void (* register_in_network) (MMIfaceModemCdma *self,
guint max_registration_time,
GAsyncReadyCallback callback,
gpointer user_data);
gboolean (*register_in_network_finish) (MMIfaceModemCdma *self,
GAsyncResult *res,
GError **error);
/* Run CDMA1x/EV-DO registration state checks..
* Note that no registration state is returned, implementations should call
* mm_iface_modem_cdma_update_registration_state().
*
* NOTE: Plugins implementing this method will NOT execute the generic
* registration check logic involving setup_registration_checks(),
* get_call_manager_state(), get_hdr_state(), get_service_status(),
* get_cdma1x_serving_system() and get_detailed_registration_state().
*
* In other words, it is fine to leave this callback to NULL if you want
* the generic steps to run. This callback may be implemented if there
* is a completely independent way/command which can gather both CDMA1x
* and EV-DO registration states, SID and NID.
*/
void (* run_registration_checks) (MMIfaceModemCdma *self,
gboolean cdma1x_supported,
gboolean evdo_supported,
GAsyncReadyCallback callback,
gpointer user_data);
gboolean (* run_registration_checks_finish) (MMIfaceModemCdma *self,
GAsyncResult *res,
GError **error);
/* The following steps will only be run if run_registration_checks() is NOT
* given by the object implementing the interface */
/* Setup registration checks */ /* Setup registration checks */
void (* setup_registration_checks) (MMIfaceModemCdma *self, void (* setup_registration_checks) (MMIfaceModemCdma *self,
GAsyncReadyCallback callback, GAsyncReadyCallback callback,
@@ -124,7 +162,6 @@ struct _MMIfaceModemCdma {
gboolean *skip_at_cdma1x_serving_system_step, gboolean *skip_at_cdma1x_serving_system_step,
gboolean *skip_detailed_registration_state, gboolean *skip_detailed_registration_state,
GError **error); GError **error);
/* Get call manager state */ /* Get call manager state */
void (* get_call_manager_state) (MMIfaceModemCdma *self, void (* get_call_manager_state) (MMIfaceModemCdma *self,
GAsyncReadyCallback callback, GAsyncReadyCallback callback,
@@ -134,7 +171,6 @@ struct _MMIfaceModemCdma {
guint *operating_mode, guint *operating_mode,
guint *system_mode, guint *system_mode,
GError **error); GError **error);
/* Get HDR state */ /* Get HDR state */
void (* get_hdr_state) (MMIfaceModemCdma *self, void (* get_hdr_state) (MMIfaceModemCdma *self,
GAsyncReadyCallback callback, GAsyncReadyCallback callback,
@@ -145,7 +181,6 @@ struct _MMIfaceModemCdma {
guint8 *session_state, guint8 *session_state,
guint8 *almp_state, guint8 *almp_state,
GError **error); GError **error);
/* Get service status */ /* Get service status */
void (* get_service_status) (MMIfaceModemCdma *self, void (* get_service_status) (MMIfaceModemCdma *self,
GAsyncReadyCallback callback, GAsyncReadyCallback callback,
@@ -154,7 +189,6 @@ struct _MMIfaceModemCdma {
GAsyncResult *res, GAsyncResult *res,
gboolean *has_cdma_service, gboolean *has_cdma_service,
GError **error); GError **error);
/* Get CDMA1x serving system */ /* Get CDMA1x serving system */
void (* get_cdma1x_serving_system) (MMIfaceModemCdma *self, void (* get_cdma1x_serving_system) (MMIfaceModemCdma *self,
GAsyncReadyCallback callback, GAsyncReadyCallback callback,
@@ -166,7 +200,6 @@ struct _MMIfaceModemCdma {
guint *sid, guint *sid,
guint *nid, guint *nid,
GError **error); GError **error);
/* Get detailed registration state */ /* Get detailed registration state */
void (* get_detailed_registration_state) (MMIfaceModemCdma *self, void (* get_detailed_registration_state) (MMIfaceModemCdma *self,
MMModemCdmaRegistrationState cdma1x_state, MMModemCdmaRegistrationState cdma1x_state,
@@ -178,15 +211,6 @@ struct _MMIfaceModemCdma {
MMModemCdmaRegistrationState *detailed_cdma1x_state, MMModemCdmaRegistrationState *detailed_cdma1x_state,
MMModemCdmaRegistrationState *detailed_evdo_state, MMModemCdmaRegistrationState *detailed_evdo_state,
GError **error); GError **error);
/* Try to register in the CDMA network */
void (* register_in_network) (MMIfaceModemCdma *self,
guint max_registration_time,
GAsyncReadyCallback callback,
gpointer user_data);
gboolean (*register_in_network_finish) (MMIfaceModemCdma *self,
GAsyncResult *res,
GError **error);
}; };
GType mm_iface_modem_cdma_get_type (void); GType mm_iface_modem_cdma_get_type (void);