summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2017-03-06 09:05:53 -0600
committerDan Williams <dcbw@redhat.com>2017-04-09 21:40:42 -0500
commit3297fd9b27987185e9d123bd1070c1359d5df8d9 (patch)
treee03e9882f7f9ea6bff5244f40ed4c62b15f87588
parent5cfa8ccc3d59b37aef23f56bd868f4a383ddb4f0 (diff)
downloadModemManager-dcbw/qcdm-cleanups.tar.gz
broadband-modem: open QCDM port for CDMA Serving System checking when neededdcbw/qcdm-cleanups
-rw-r--r--src/mm-broadband-modem.c201
1 files changed, 102 insertions, 99 deletions
diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c
index 5b93c344e..b480255ba 100644
--- a/src/mm-broadband-modem.c
+++ b/src/mm-broadband-modem.c
@@ -7232,21 +7232,30 @@ typedef struct {
guint band;
} Cdma1xServingSystemResults;
-typedef struct {
- MMBroadbandModem *self;
- GSimpleAsyncResult *result;
- MMPortSerialQcdm *qcdm;
-} Cdma1xServingSystemContext;
+static void
+cdma1x_serving_system_state_cleanup_port (MMPortSerial *port)
+{
+ mm_port_serial_close (port);
+ g_object_unref (port);
+}
static void
-cdma1x_serving_system_context_complete_and_free (Cdma1xServingSystemContext *ctx)
+cdma1x_serving_system_complete_and_free (GTask *task,
+ guint sid,
+ guint nid,
+ guint class,
+ guint band)
{
- g_simple_async_result_complete (ctx->result);
- if (ctx->qcdm)
- g_object_unref (ctx->qcdm);
- g_object_unref (ctx->result);
- g_object_unref (ctx->self);
- g_free (ctx);
+ Cdma1xServingSystemResults *results;
+
+ results = g_new0 (Cdma1xServingSystemResults, 1);
+ results->sid = sid;
+ results->band = band;
+ results->class = class;
+ results->nid = nid;
+
+ g_task_return_pointer (task, results, g_free);
+ g_object_unref (task);
}
static GError *
@@ -7270,21 +7279,23 @@ modem_cdma_get_cdma1x_serving_system_finish (MMIfaceModemCdma *self,
{
Cdma1xServingSystemResults *results;
- if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error))
+ results = g_task_propagate_pointer (G_TASK (res), error);
+ if (!results)
return FALSE;
- results = (Cdma1xServingSystemResults *)g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res));
*sid = results->sid;
*nid = results->nid;
*class = results->class;
*band = results->band;
+ g_free (results);
+
return TRUE;
}
static void
css_query_ready (MMIfaceModemCdma *self,
GAsyncResult *res,
- Cdma1xServingSystemContext *ctx)
+ GTask *task)
{
GError *error = NULL;
const gchar *result;
@@ -7295,12 +7306,11 @@ css_query_ready (MMIfaceModemCdma *self,
gboolean class_ok = FALSE;
gboolean band_ok = FALSE;
gboolean success = FALSE;
- Cdma1xServingSystemResults *results;
result = mm_base_modem_at_command_finish (MM_BASE_MODEM (self), res, &error);
if (error) {
- g_simple_async_result_take_error (ctx->result, error);
- cdma1x_serving_system_context_complete_and_free (ctx);
+ g_task_return_error (task, error);
+ g_object_unref (task);
return;
}
@@ -7321,15 +7331,7 @@ css_query_ready (MMIfaceModemCdma *self,
/* Format is "<band_class>,<band>,<sid>" */
r = g_regex_new ("\\s*([^,]*?)\\s*,\\s*([^,]*?)\\s*,\\s*(\\d+)", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL);
- if (!r) {
- g_simple_async_result_set_error (
- ctx->result,
- MM_CORE_ERROR,
- MM_CORE_ERROR_FAILED,
- "Could not parse Serving System results (regex creation failed).");
- cdma1x_serving_system_context_complete_and_free (ctx);
- return;
- }
+ g_assert (r);
g_regex_match (r, result, 0, &match_info);
if (g_match_info_get_match_count (match_info) >= 3) {
@@ -7362,12 +7364,11 @@ css_query_ready (MMIfaceModemCdma *self,
}
if (!success) {
- g_simple_async_result_set_error (
- ctx->result,
- MM_CORE_ERROR,
- MM_CORE_ERROR_FAILED,
- "Could not parse Serving System results");
- cdma1x_serving_system_context_complete_and_free (ctx);
+ g_task_return_new_error (task,
+ MM_CORE_ERROR,
+ MM_CORE_ERROR_FAILED,
+ "Could not parse Serving System results");
+ g_object_unref (task);
return;
}
@@ -7391,29 +7392,31 @@ css_query_ready (MMIfaceModemCdma *self,
/* 99999 means unknown/no service */
if (sid == MM_MODEM_CDMA_SID_UNKNOWN) {
- g_simple_async_result_take_error (ctx->result,
- cdma1x_serving_system_no_service_error ());
- cdma1x_serving_system_context_complete_and_free (ctx);
+ g_task_return_error (task, cdma1x_serving_system_no_service_error ());
+ g_object_unref (task);
return;
}
- results = g_new0 (Cdma1xServingSystemResults, 1);
- results->sid = sid;
- results->band = band;
- results->class = class;
/* No means to get NID with AT commands right now */
- results->nid = MM_MODEM_CDMA_NID_UNKNOWN;
+ cdma1x_serving_system_complete_and_free (task, sid, MM_MODEM_CDMA_NID_UNKNOWN, class, band);
+}
- g_simple_async_result_set_op_res_gpointer (ctx->result, results, g_free);
- cdma1x_serving_system_context_complete_and_free (ctx);
+static void
+serving_system_query_css (GTask *task)
+{
+ mm_base_modem_at_command (MM_BASE_MODEM (g_task_get_source_object (task)),
+ "+CSS?",
+ 3,
+ FALSE,
+ (GAsyncReadyCallback)css_query_ready,
+ task);
}
static void
qcdm_cdma_status_ready (MMPortSerialQcdm *port,
GAsyncResult *res,
- Cdma1xServingSystemContext *ctx)
+ GTask *task)
{
- Cdma1xServingSystemResults *results;
QcdmResult *result = NULL;
guint32 sid = MM_MODEM_CDMA_SID_UNKNOWN;
guint32 nid = MM_MODEM_CDMA_NID_UNKNOWN;
@@ -7423,23 +7426,25 @@ qcdm_cdma_status_ready (MMPortSerialQcdm *port,
GByteArray *response;
response = mm_port_serial_qcdm_command_finish (port, res, &error);
- if (error ||
- (result = qcdm_cmd_cdma_status_result ((const gchar *) response->data,
- response->len,
- &err)) == NULL) {
+ if (error) {
+ mm_dbg ("Failed to get cdma status: %s", error->message);
+ g_clear_error (&error);
+
+ /* Fall back to AT+CSS */
+ serving_system_query_css (task);
+ return;
+ }
+
+ result = qcdm_cmd_cdma_status_result ((const gchar *) response->data,
+ response->len,
+ &err);
+ if (!result) {
if (err != QCDM_SUCCESS)
mm_dbg ("Failed to parse cdma status command result: %d", err);
- /* If there was some error, fall back to use +CSS like we did before QCDM */
- mm_base_modem_at_command (MM_BASE_MODEM (ctx->self),
- "+CSS?",
- 3,
- FALSE,
- (GAsyncReadyCallback)css_query_ready,
- ctx);
- if (error)
- g_error_free (error);
- if (response)
- g_byte_array_unref (response);
+ g_byte_array_unref (response);
+
+ /* Fall back to AT+CSS */
+ serving_system_query_css (task);
return;
}
@@ -7460,16 +7465,11 @@ qcdm_cdma_status_ready (MMPortSerialQcdm *port,
mm_dbg ("CDMA 1x Status SID: %d", sid);
mm_dbg ("CDMA 1x Status NID: %d", nid);
- results = g_new0 (Cdma1xServingSystemResults, 1);
- results->sid = sid;
- results->nid = nid;
- if (sid != MM_MODEM_CDMA_SID_UNKNOWN) {
- results->band = 'Z';
- results->class = 0;
- }
-
- g_simple_async_result_set_op_res_gpointer (ctx->result, results, g_free);
- cdma1x_serving_system_context_complete_and_free (ctx);
+ cdma1x_serving_system_complete_and_free (task,
+ sid,
+ nid,
+ 0,
+ (sid == MM_MODEM_CDMA_SID_UNKNOWN) ? 0 : 'Z');
}
static void
@@ -7477,41 +7477,44 @@ modem_cdma_get_cdma1x_serving_system (MMIfaceModemCdma *self,
GAsyncReadyCallback callback,
gpointer user_data)
{
- Cdma1xServingSystemContext *ctx;
+ GError *error = NULL;
+ GByteArray *cdma_status;
+ GTask *task;
+ MMPortSerialQcdm *qcdm;
- /* Setup context */
- ctx = g_new0 (Cdma1xServingSystemContext, 1);
- ctx->self = g_object_ref (self);
- ctx->result = g_simple_async_result_new (G_OBJECT (self),
- callback,
- user_data,
- modem_cdma_get_cdma1x_serving_system);
- ctx->qcdm = mm_base_modem_get_port_qcdm (MM_BASE_MODEM (self));
+ task = g_task_new (self, NULL, callback, user_data);
- if (ctx->qcdm) {
- GByteArray *cdma_status;
+ qcdm = mm_base_modem_peek_port_qcdm (MM_BASE_MODEM (self));
+ if (!qcdm) {
+ /* Fall back to AT+CSS */
+ serving_system_query_css (task);
+ return;
+ }
- /* Setup command */
- cdma_status = g_byte_array_sized_new (25);
- cdma_status->len = qcdm_cmd_cdma_status_new ((char *) cdma_status->data, 25);
- g_assert (cdma_status->len);
- mm_port_serial_qcdm_command (ctx->qcdm,
- cdma_status,
- 3,
- NULL,
- (GAsyncReadyCallback)qcdm_cdma_status_ready,
- ctx);
- g_byte_array_unref (cdma_status);
+ if (!mm_port_serial_open (MM_PORT_SERIAL (qcdm), &error)) {
+ mm_dbg ("Failed to open QCDM port for serving-system request: %s", error->message);
+ g_error_free (error);
+
+ /* Fall back to AT+CSS */
+ serving_system_query_css (task);
return;
}
- /* Try with AT if we don't have QCDM */
- mm_base_modem_at_command (MM_BASE_MODEM (self),
- "+CSS?",
- 3,
- FALSE,
- (GAsyncReadyCallback)css_query_ready,
- ctx);
+ g_task_set_task_data (task,
+ g_object_ref (qcdm),
+ (GDestroyNotify) cdma1x_serving_system_state_cleanup_port);
+
+ /* Setup command */
+ cdma_status = g_byte_array_sized_new (25);
+ cdma_status->len = qcdm_cmd_cdma_status_new ((char *) cdma_status->data, 25);
+ g_assert (cdma_status->len);
+ mm_port_serial_qcdm_command (qcdm,
+ cdma_status,
+ 3,
+ NULL,
+ (GAsyncReadyCallback) qcdm_cdma_status_ready,
+ task);
+ g_byte_array_unref (cdma_status);
}
/*****************************************************************************/