sierra: port dial_3gpp to use GTask
This commit is contained in:
committed by
Aleksander Morgado
parent
043645ea57
commit
4c2ebaba16
@@ -56,27 +56,20 @@ typedef enum {
|
||||
} Dial3gppStep;
|
||||
|
||||
typedef struct {
|
||||
MMBroadbandBearerSierra *self;
|
||||
MMBaseModem *modem;
|
||||
MMPortSerialAt *primary;
|
||||
guint cid;
|
||||
GCancellable *cancellable;
|
||||
GSimpleAsyncResult *result;
|
||||
MMPort *data;
|
||||
Dial3gppStep step;
|
||||
} Dial3gppContext;
|
||||
|
||||
static void
|
||||
dial_3gpp_context_complete_and_free (Dial3gppContext *ctx)
|
||||
dial_3gpp_context_free (Dial3gppContext *ctx)
|
||||
{
|
||||
g_simple_async_result_complete_in_idle (ctx->result);
|
||||
g_object_unref (ctx->cancellable);
|
||||
g_object_unref (ctx->result);
|
||||
if (ctx->data)
|
||||
g_object_unref (ctx->data);
|
||||
g_object_unref (ctx->primary);
|
||||
g_object_unref (ctx->modem);
|
||||
g_object_unref (ctx->self);
|
||||
g_slice_free (Dial3gppContext, ctx);
|
||||
}
|
||||
|
||||
@@ -85,97 +78,108 @@ dial_3gpp_finish (MMBroadbandBearer *self,
|
||||
GAsyncResult *res,
|
||||
GError **error)
|
||||
{
|
||||
if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error))
|
||||
return NULL;
|
||||
|
||||
return MM_PORT (g_object_ref (g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res))));
|
||||
return g_task_propagate_pointer (G_TASK (res), error);
|
||||
}
|
||||
|
||||
static void dial_3gpp_context_step (Dial3gppContext *ctx);
|
||||
static void dial_3gpp_context_step (GTask *task);
|
||||
|
||||
static void
|
||||
parent_dial_3gpp_ready (MMBroadbandBearer *self,
|
||||
GAsyncResult *res,
|
||||
Dial3gppContext *ctx)
|
||||
GTask *task)
|
||||
{
|
||||
Dial3gppContext *ctx;
|
||||
GError *error = NULL;
|
||||
|
||||
ctx = g_task_get_task_data (task);
|
||||
|
||||
ctx->data = MM_BROADBAND_BEARER_CLASS (mm_broadband_bearer_sierra_parent_class)->dial_3gpp_finish (self, res, &error);
|
||||
if (!ctx->data) {
|
||||
g_simple_async_result_take_error (ctx->result, error);
|
||||
dial_3gpp_context_complete_and_free (ctx);
|
||||
g_task_return_error (task, error);
|
||||
g_object_unref (task);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Go on */
|
||||
ctx->step++;
|
||||
dial_3gpp_context_step (ctx);
|
||||
dial_3gpp_context_step (task);
|
||||
}
|
||||
|
||||
static void
|
||||
scact_ready (MMBaseModem *modem,
|
||||
GAsyncResult *res,
|
||||
Dial3gppContext *ctx)
|
||||
GTask *task)
|
||||
{
|
||||
Dial3gppContext *ctx;
|
||||
GError *error = NULL;
|
||||
|
||||
ctx = g_task_get_task_data (task);
|
||||
|
||||
if (!mm_base_modem_at_command_full_finish (modem, res, &error)) {
|
||||
g_simple_async_result_take_error (ctx->result, error);
|
||||
dial_3gpp_context_complete_and_free (ctx);
|
||||
g_task_return_error (task, error);
|
||||
g_object_unref (task);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Go on */
|
||||
ctx->step++;
|
||||
dial_3gpp_context_step (ctx);
|
||||
dial_3gpp_context_step (task);
|
||||
}
|
||||
|
||||
static void
|
||||
authenticate_ready (MMBaseModem *modem,
|
||||
GAsyncResult *res,
|
||||
Dial3gppContext *ctx)
|
||||
GTask *task)
|
||||
{
|
||||
Dial3gppContext *ctx;
|
||||
GError *error = NULL;
|
||||
|
||||
ctx = g_task_get_task_data (task);
|
||||
|
||||
if (!mm_base_modem_at_command_full_finish (modem, res, &error)) {
|
||||
g_simple_async_result_take_error (ctx->result, error);
|
||||
dial_3gpp_context_complete_and_free (ctx);
|
||||
g_task_return_error (task, error);
|
||||
g_object_unref (task);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Go on */
|
||||
ctx->step++;
|
||||
dial_3gpp_context_step (ctx);
|
||||
dial_3gpp_context_step (task);
|
||||
}
|
||||
|
||||
static void
|
||||
cgatt_ready (MMBaseModem *modem,
|
||||
GAsyncResult *res,
|
||||
Dial3gppContext *ctx)
|
||||
GTask *task)
|
||||
{
|
||||
Dial3gppContext *ctx;
|
||||
GError *error = NULL;
|
||||
|
||||
ctx = g_task_get_task_data (task);
|
||||
|
||||
if (!mm_base_modem_at_command_full_finish (modem, res, &error)) {
|
||||
g_simple_async_result_take_error (ctx->result, error);
|
||||
dial_3gpp_context_complete_and_free (ctx);
|
||||
g_task_return_error (task, error);
|
||||
g_object_unref (task);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Go on */
|
||||
ctx->step++;
|
||||
dial_3gpp_context_step (ctx);
|
||||
dial_3gpp_context_step (task);
|
||||
}
|
||||
|
||||
static void
|
||||
dial_3gpp_context_step (Dial3gppContext *ctx)
|
||||
dial_3gpp_context_step (GTask *task)
|
||||
{
|
||||
if (g_cancellable_is_cancelled (ctx->cancellable)) {
|
||||
g_simple_async_result_set_error (ctx->result,
|
||||
MM_CORE_ERROR,
|
||||
MM_CORE_ERROR_CANCELLED,
|
||||
"Dial operation has been cancelled");
|
||||
dial_3gpp_context_complete_and_free (ctx);
|
||||
return;
|
||||
MMBroadbandBearerSierra *self;
|
||||
Dial3gppContext *ctx;
|
||||
|
||||
self = g_task_get_source_object (task);
|
||||
ctx = g_task_get_task_data (task);
|
||||
|
||||
if (g_task_return_error_if_cancelled (task)) {
|
||||
g_object_unref (task);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (ctx->step) {
|
||||
@@ -192,7 +196,7 @@ dial_3gpp_context_step (Dial3gppContext *ctx)
|
||||
FALSE, /* raw */
|
||||
NULL, /* cancellable */
|
||||
(GAsyncReadyCallback)cgatt_ready,
|
||||
ctx);
|
||||
task);
|
||||
return;
|
||||
|
||||
case DIAL_3GPP_STEP_AUTHENTICATE:
|
||||
@@ -202,13 +206,13 @@ dial_3gpp_context_step (Dial3gppContext *ctx)
|
||||
const gchar *password;
|
||||
MMBearerAllowedAuth allowed_auth;
|
||||
|
||||
user = mm_bearer_properties_get_user (mm_base_bearer_peek_config (MM_BASE_BEARER (ctx->self)));
|
||||
password = mm_bearer_properties_get_password (mm_base_bearer_peek_config (MM_BASE_BEARER (ctx->self)));
|
||||
allowed_auth = mm_bearer_properties_get_allowed_auth (mm_base_bearer_peek_config (MM_BASE_BEARER (ctx->self)));
|
||||
user = mm_bearer_properties_get_user (mm_base_bearer_peek_config (MM_BASE_BEARER (self)));
|
||||
password = mm_bearer_properties_get_password (mm_base_bearer_peek_config (MM_BASE_BEARER (self)));
|
||||
allowed_auth = mm_bearer_properties_get_allowed_auth (mm_base_bearer_peek_config (MM_BASE_BEARER (self)));
|
||||
|
||||
if (!user || !password || allowed_auth == MM_BEARER_ALLOWED_AUTH_NONE) {
|
||||
mm_dbg ("Not using authentication");
|
||||
if (ctx->self->priv->is_icera)
|
||||
if (self->priv->is_icera)
|
||||
command = g_strdup_printf ("%%IPDPCFG=%d,0,0,\"\",\"\"", ctx->cid);
|
||||
else
|
||||
command = g_strdup_printf ("$QCPDPP=%d,0", ctx->cid);
|
||||
@@ -230,20 +234,20 @@ dial_3gpp_context_step (Dial3gppContext *ctx)
|
||||
gchar *str;
|
||||
|
||||
str = mm_bearer_allowed_auth_build_string_from_mask (allowed_auth);
|
||||
g_simple_async_result_set_error (
|
||||
ctx->result,
|
||||
g_task_return_new_error (
|
||||
task,
|
||||
MM_CORE_ERROR,
|
||||
MM_CORE_ERROR_UNSUPPORTED,
|
||||
"Cannot use any of the specified authentication methods (%s)",
|
||||
str);
|
||||
g_free (str);
|
||||
dial_3gpp_context_complete_and_free (ctx);
|
||||
g_object_unref (task);
|
||||
return;
|
||||
}
|
||||
|
||||
quoted_user = mm_port_serial_at_quote_string (user);
|
||||
quoted_password = mm_port_serial_at_quote_string (password);
|
||||
if (ctx->self->priv->is_icera) {
|
||||
if (self->priv->is_icera) {
|
||||
command = g_strdup_printf ("%%IPDPCFG=%d,0,%u,%s,%s",
|
||||
ctx->cid,
|
||||
sierra_auth,
|
||||
@@ -269,7 +273,7 @@ dial_3gpp_context_step (Dial3gppContext *ctx)
|
||||
FALSE, /* raw */
|
||||
NULL, /* cancellable */
|
||||
(GAsyncReadyCallback)authenticate_ready,
|
||||
ctx);
|
||||
task);
|
||||
g_free (command);
|
||||
return;
|
||||
}
|
||||
@@ -292,27 +296,27 @@ dial_3gpp_context_step (Dial3gppContext *ctx)
|
||||
FALSE, /* raw */
|
||||
NULL, /* cancellable */
|
||||
(GAsyncReadyCallback)scact_ready,
|
||||
ctx);
|
||||
task);
|
||||
g_free (command);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Chain up parent's dialling if we don't have a net port */
|
||||
MM_BROADBAND_BEARER_CLASS (mm_broadband_bearer_sierra_parent_class)->dial_3gpp (
|
||||
MM_BROADBAND_BEARER (ctx->self),
|
||||
MM_BROADBAND_BEARER (self),
|
||||
ctx->modem,
|
||||
ctx->primary,
|
||||
ctx->cid,
|
||||
ctx->cancellable,
|
||||
g_task_get_cancellable (task),
|
||||
(GAsyncReadyCallback)parent_dial_3gpp_ready,
|
||||
ctx);
|
||||
task);
|
||||
return;
|
||||
|
||||
case DIAL_3GPP_STEP_LAST:
|
||||
g_simple_async_result_set_op_res_gpointer (ctx->result,
|
||||
g_object_ref (ctx->data),
|
||||
g_object_unref);
|
||||
dial_3gpp_context_complete_and_free (ctx);
|
||||
g_task_return_pointer (task,
|
||||
g_object_ref (ctx->data),
|
||||
g_object_unref);
|
||||
g_object_unref (task);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -327,22 +331,20 @@ dial_3gpp (MMBroadbandBearer *self,
|
||||
gpointer user_data)
|
||||
{
|
||||
Dial3gppContext *ctx;
|
||||
GTask *task;
|
||||
|
||||
g_assert (primary != NULL);
|
||||
|
||||
ctx = g_slice_new0 (Dial3gppContext);
|
||||
ctx->self = g_object_ref (self);
|
||||
ctx->modem = g_object_ref (modem);
|
||||
ctx->primary = g_object_ref (primary);
|
||||
ctx->cid = cid;
|
||||
ctx->result = g_simple_async_result_new (G_OBJECT (self),
|
||||
callback,
|
||||
user_data,
|
||||
dial_3gpp);
|
||||
ctx->cancellable = g_object_ref (cancellable);
|
||||
ctx->step = DIAL_3GPP_STEP_FIRST;
|
||||
|
||||
dial_3gpp_context_step (ctx);
|
||||
task = g_task_new (self, cancellable, callback, user_data);
|
||||
g_task_set_task_data (task, ctx, (GDestroyNotify)dial_3gpp_context_free);
|
||||
|
||||
dial_3gpp_context_step (task);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
Reference in New Issue
Block a user