cli: new '--uim-get-card-status' action

This commit is contained in:
Aleksander Morgado 2014-04-28 16:19:15 +02:00
parent 120d84f0f5
commit 07ea29dc9c
1 changed files with 168 additions and 0 deletions

View File

@ -44,6 +44,7 @@ static Context *ctx;
/* Options */
static gchar *read_transparent_str;
static gchar *get_file_attributes_str;
static gboolean get_card_status_flag;
static gboolean reset_flag;
static gboolean noop_flag;
@ -56,6 +57,10 @@ static GOptionEntry entries[] = {
"Get the attributes of a given file",
"[0xNNNN,0xNNNN,...]"
},
{ "uim-get-card-status", 0, 0, G_OPTION_ARG_NONE, &get_card_status_flag,
"Get card status",
NULL
},
{ "uim-reset", 0, 0, G_OPTION_ARG_NONE, &reset_flag,
"Reset the service state",
NULL
@ -93,6 +98,7 @@ qmicli_uim_options_enabled (void)
n_actions = (!!read_transparent_str +
!!get_file_attributes_str +
get_card_status_flag +
reset_flag +
noop_flag);
@ -163,6 +169,156 @@ noop_cb (gpointer unused)
return FALSE;
}
static void
get_card_status_ready (QmiClientUim *client,
GAsyncResult *res)
{
QmiMessageUimGetCardStatusOutput *output;
GError *error = NULL;
guint16 index_gw_primary;
guint16 index_1x_primary;
guint16 index_gw_secondary;
guint16 index_1x_secondary;
GArray *cards;
guint i;
output = qmi_client_uim_get_card_status_finish (client, res, &error);
if (!output) {
g_printerr ("error: operation failed: %s\n", error->message);
g_error_free (error);
shutdown (FALSE);
return;
}
if (!qmi_message_uim_get_card_status_output_get_result (output, &error)) {
g_printerr ("error: couldn't get card status: %s\n", error->message);
g_error_free (error);
qmi_message_uim_get_card_status_output_unref (output);
shutdown (FALSE);
return;
}
g_print ("[%s] Successfully got card status\n",
qmi_device_get_path_display (ctx->device));
qmi_message_uim_get_card_status_output_get_card_status (
output,
&index_gw_primary,
&index_1x_primary,
&index_gw_secondary,
&index_1x_secondary,
&cards,
NULL);
#undef VALIDATE_UNKNOWN
#define VALIDATE_UNKNOWN(str) (str ? str : "unknown")
g_print ("Provisioning applications:\n");
if (index_gw_primary == 0xFFFF)
g_print ("\tPrimary GW: session doesn't exist\n");
else
g_print ("\tPrimary GW: slot '%u', application '%u'\n",
((index_gw_primary & 0xFF00) >> 8),
((index_gw_primary & 0x00FF)));
if (index_1x_primary == 0xFFFF)
g_print ("\tPrimary 1X: session doesn't exist\n");
else
g_print ("\tPrimary 1X: slot '%u', application '%u'\n",
((index_1x_primary & 0xFF00) >> 8),
((index_1x_primary & 0x00FF)));
if (index_gw_secondary == 0xFFFF)
g_print ("\tSecondary GW: session doesn't exist\n");
else
g_print ("\tSecondary GW: slot '%u', application '%u'\n",
((index_gw_secondary & 0xFF00) >> 8),
((index_gw_secondary & 0x00FF)));
if (index_1x_secondary == 0xFFFF)
g_print ("\tSecondary 1X: session doesn't exist\n");
else
g_print ("\tSecondary 1X: slot '%u', application '%u'\n",
((index_1x_secondary & 0xFF00) >> 8),
((index_1x_secondary & 0x00FF)));
for (i = 0; i < cards->len; i++) {
QmiMessageUimGetCardStatusOutputCardStatusCardsElement *card;
guint j;
card = &g_array_index (cards, QmiMessageUimGetCardStatusOutputCardStatusCardsElement, i);
g_print ("Card [%u]:\n", i);
if (card->card_state != QMI_UIM_CARD_STATE_ERROR)
g_print ("\tCard state: '%s'\n",
qmi_uim_card_state_get_string (card->card_state));
else
g_print ("\tCard state: '%s: %s (%u)\n",
qmi_uim_card_state_get_string (card->card_state),
VALIDATE_UNKNOWN (qmi_uim_card_error_get_string (card->error_code)),
card->error_code);
g_print ("\tUPIN state: '%s'\n"
"\t\tUPIN retries: '%u'\n"
"\t\tUPUK retries: '%u'\n",
qmi_uim_pin_state_get_string (card->upin_state),
card->upin_retries,
card->upuk_retries);
for (j = 0; j < card->applications->len; j++) {
QmiMessageUimGetCardStatusOutputCardStatusCardsElementApplicationsElement *app;
gchar *str;
app = &g_array_index (card->applications, QmiMessageUimGetCardStatusOutputCardStatusCardsElementApplicationsElement, j);
str = qmicli_get_raw_data_printable (app->application_identifier_value, 80, "");
g_print ("\tApplication [%u]:\n"
"\t\tApplication type: '%s (%u)'\n"
"\t\tApplication state: '%s'\n"
"\t\tApplication ID:\n"
"\t\t\t%s",
j,
VALIDATE_UNKNOWN (qmi_uim_card_application_type_get_string (app->type)), app->type,
qmi_uim_card_application_state_get_string (app->state),
str);
if (app->personalization_state == QMI_UIM_CARD_APPLICATION_PERSONALIZATION_STATE_CODE_REQUIRED ||
app->personalization_state == QMI_UIM_CARD_APPLICATION_PERSONALIZATION_STATE_PUK_CODE_REQUIRED)
g_print ("\t\tPersonalization state: '%s' (feature: %s)\n"
"\t\t\tDisable retries: '%u'\n"
"\t\t\tUnblock retries: '%u'\n",
qmi_uim_card_application_personalization_state_get_string (app->personalization_state),
qmi_uim_card_application_personalization_feature_get_string (app->personalization_feature),
app->personalization_retries,
app->personalization_unblock_retries);
else
g_print ("\t\tPersonalization state: '%s'\n",
qmi_uim_card_application_personalization_state_get_string (app->personalization_state));
g_print ("\t\tUPIN replaces PIN1: '%s'\n",
app->upin_replaces_pin1 ? "yes" : "no");
g_print ("\t\tPIN1 state: '%s'\n"
"\t\t\tPIN1 retries: '%u'\n"
"\t\t\tPUK1 retries: '%u'\n"
"\t\tPIN2 state: '%s'\n"
"\t\t\tPIN2 retries: '%u'\n"
"\t\t\tPUK2 retries: '%u'\n",
qmi_uim_pin_state_get_string (app->pin1_state),
app->pin1_retries,
app->puk1_retries,
qmi_uim_pin_state_get_string (app->pin2_state),
app->pin2_retries,
app->puk2_retries);
g_free (str);
}
}
qmi_message_uim_get_card_status_output_unref (output);
shutdown (TRUE);
}
static gboolean
get_sim_file_id_and_path (const gchar *file_path_str,
guint16 *file_id,
@ -534,6 +690,18 @@ qmicli_uim_run (QmiDevice *device,
return;
}
/* Request to read card status? */
if (get_card_status_flag) {
g_debug ("Asynchronously getting card status...");
qmi_client_uim_get_card_status (ctx->client,
NULL,
10,
ctx->cancellable,
(GAsyncReadyCallback)get_card_status_ready,
NULL);
return;
}
/* Request to reset UIM service? */
if (reset_flag) {
g_debug ("Asynchronously resetting UIM service...");