diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2012-01-21 15:58:51 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-03-15 14:14:55 +0100 |
commit | 93a776b17c3265c952fd071bbd8bbd2c70d83e73 (patch) | |
tree | 592ae16a511180201ab2e34f7d89dbab23216094 | |
parent | c65c5aedc334d5eaa0a186c183f79b2c5645379f (diff) |
sim: allow subclassing pin change/enabling
-rw-r--r-- | src/mm-sim.c | 188 | ||||
-rw-r--r-- | src/mm-sim.h | 20 |
2 files changed, 168 insertions, 40 deletions
diff --git a/src/mm-sim.c b/src/mm-sim.c index 0ac361de..6241a8e8 100644 --- a/src/mm-sim.c +++ b/src/mm-sim.c @@ -100,76 +100,180 @@ dbus_call_context_new (MMSim *self, return ctx; } -#undef NO_REPLY_READY_FN -#define NO_REPLY_READY_FN(NAME) \ - static void \ - handle_##NAME##_ready (MMBaseModem *modem, \ - GAsyncResult *res, \ - DbusCallContext *ctx) \ - { \ - GError *error = NULL; \ - \ - mm_base_modem_at_command_finish (MM_BASE_MODEM (modem), res, &error); \ - if (error) \ - g_dbus_method_invocation_take_error (ctx->invocation, error); \ - else \ - mm_gdbus_sim_complete_##NAME (MM_GDBUS_SIM (ctx->self), ctx->invocation); \ - dbus_call_context_free (ctx); \ - } - /*****************************************************************************/ -/* CHANGE PIN */ - -NO_REPLY_READY_FN (change_pin) +/* CHANGE PIN (Generic implementation) */ static gboolean -handle_change_pin (MMSim *self, - GDBusMethodInvocation *invocation, - const gchar *arg_old_pin, - const gchar *arg_new_pin) +change_pin_finish (MMSim *self, + GAsyncResult *res, + GError **error) +{ + return !g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error); +} + +static void +change_pin_ready (MMBaseModem *modem, + GAsyncResult *res, + GSimpleAsyncResult *simple) { + GError *error = NULL; + + mm_base_modem_at_command_finish (modem, res, &error); + if (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); +} + +static void +change_pin (MMSim *self, + const gchar *old_pin, + const gchar *new_pin, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *result; gchar *command; + result = g_simple_async_result_new (G_OBJECT (self), + callback, + user_data, + change_pin); + command = g_strdup_printf ("+CPWD=\"SC\",\"%s\",\"%s\"", - arg_old_pin, - arg_new_pin); + old_pin, + new_pin); mm_base_modem_at_command (MM_BASE_MODEM (self->priv->modem), command, 3, FALSE, NULL, /* cancellable */ - (GAsyncReadyCallback)handle_change_pin_ready, - dbus_call_context_new (self, - invocation)); + (GAsyncReadyCallback)change_pin_ready, + result); g_free (command); - return TRUE; } /*****************************************************************************/ -/* ENABLE PIN */ +/* CHANGE PIN (DBus call handling) */ -NO_REPLY_READY_FN (enable_pin) +static void +handle_change_pin_ready (MMSim *self, + GAsyncResult *res, + DbusCallContext *ctx) +{ + GError *error = NULL; + + MM_SIM_GET_CLASS (self)->change_pin_finish (self, res, &error); + if (error) + g_dbus_method_invocation_take_error (ctx->invocation, error); + else + mm_gdbus_sim_complete_change_pin (MM_GDBUS_SIM (ctx->self), ctx->invocation); + dbus_call_context_free (ctx); +} static gboolean -handle_enable_pin (MMSim *self, +handle_change_pin (MMSim *self, GDBusMethodInvocation *invocation, - const gchar *arg_pin, - gboolean arg_enabled) + const gchar *old_pin, + const gchar *new_pin, + gboolean changed) +{ + MM_SIM_GET_CLASS (self)->change_pin (self, + old_pin, + new_pin, + (GAsyncReadyCallback)handle_change_pin_ready, + dbus_call_context_new (self, + invocation)); + return TRUE; +} + +/*****************************************************************************/ +/* ENABLE PIN (Generic implementation) */ + +static gboolean +enable_pin_finish (MMSim *self, + GAsyncResult *res, + GError **error) { + return !g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error); +} + +static void +enable_pin_ready (MMBaseModem *modem, + GAsyncResult *res, + GSimpleAsyncResult *simple) +{ + GError *error = NULL; + + mm_base_modem_at_command_finish (modem, res, &error); + if (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); +} + +static void +enable_pin (MMSim *self, + const gchar *pin, + gboolean enabled, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *result; gchar *command; + result = g_simple_async_result_new (G_OBJECT (self), + callback, + user_data, + enable_pin); + command = g_strdup_printf ("+CLCK=\"SC\",%d,\"%s\"", - arg_enabled ? 1 : 0, - arg_pin); + enabled ? 1 : 0, + pin); mm_base_modem_at_command (MM_BASE_MODEM (self->priv->modem), command, 3, FALSE, NULL, /* cancellable */ - (GAsyncReadyCallback)handle_enable_pin_ready, - dbus_call_context_new (self, - invocation)); + (GAsyncReadyCallback)enable_pin_ready, + result); g_free (command); +} + +/*****************************************************************************/ +/* ENABLE PIN (DBus call handling) */ + +static void +handle_enable_pin_ready (MMSim *self, + GAsyncResult *res, + DbusCallContext *ctx) +{ + GError *error = NULL; + + MM_SIM_GET_CLASS (self)->enable_pin_finish (self, res, &error); + if (error) + g_dbus_method_invocation_take_error (ctx->invocation, error); + else + mm_gdbus_sim_complete_enable_pin (MM_GDBUS_SIM (ctx->self), ctx->invocation); + dbus_call_context_free (ctx); +} + +static gboolean +handle_enable_pin (MMSim *self, + GDBusMethodInvocation *invocation, + const gchar *pin, + gboolean enabled) +{ + MM_SIM_GET_CLASS (self)->enable_pin (self, + pin, + enabled, + (GAsyncReadyCallback)handle_enable_pin_ready, + dbus_call_context_new (self, + invocation)); return TRUE; } @@ -1418,6 +1522,10 @@ mm_sim_class_init (MMSimClass *klass) klass->send_pin_finish = common_send_pin_puk_finish; klass->send_puk = send_puk; klass->send_puk_finish = common_send_pin_puk_finish; + klass->enable_pin = enable_pin; + klass->enable_pin_finish = enable_pin_finish; + klass->change_pin = change_pin; + klass->change_pin_finish = change_pin_finish; properties[PROP_CONNECTION] = g_param_spec_object (MM_SIM_CONNECTION, diff --git a/src/mm-sim.h b/src/mm-sim.h index 6557fd5b..a01e6561 100644 --- a/src/mm-sim.h +++ b/src/mm-sim.h @@ -82,6 +82,26 @@ struct _MMSimClass { GAsyncResult *res, GError **error); + /* Change PIN (async) */ + void (* change_pin) (MMSim *self, + const gchar *old_pin, + const gchar *new_pin, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* change_pin_finish) (MMSim *self, + GAsyncResult *res, + GError **error); + + /* Enable PIN (async) */ + void (* enable_pin) (MMSim *self, + const gchar *pin, + gboolean enabled, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* enable_pin_finish) (MMSim *self, + GAsyncResult *res, + GError **error); + /* Send PIN (async) */ void (* send_pin) (MMSim *self, const gchar *pin, |