mmcli,sim: implement --sim-set-preferred-networks function
This commit is contained in:
110
cli/mmcli-sim.c
110
cli/mmcli-sim.c
@@ -51,6 +51,7 @@ static gchar *puk_str;
|
|||||||
static gboolean enable_pin_flag;
|
static gboolean enable_pin_flag;
|
||||||
static gboolean disable_pin_flag;
|
static gboolean disable_pin_flag;
|
||||||
static gchar *change_pin_str;
|
static gchar *change_pin_str;
|
||||||
|
static gchar *set_preferred_networks_str;
|
||||||
|
|
||||||
static GOptionEntry entries[] = {
|
static GOptionEntry entries[] = {
|
||||||
{ "pin", 0, 0, G_OPTION_ARG_STRING, &pin_str,
|
{ "pin", 0, 0, G_OPTION_ARG_STRING, &pin_str,
|
||||||
@@ -73,6 +74,10 @@ static GOptionEntry entries[] = {
|
|||||||
"Change the PIN in a given SIM (must send the current PIN with --pin).",
|
"Change the PIN in a given SIM (must send the current PIN with --pin).",
|
||||||
"[New PIN]"
|
"[New PIN]"
|
||||||
},
|
},
|
||||||
|
{ "sim-set-preferred-networks", 0, 0, G_OPTION_ARG_STRING, &set_preferred_networks_str,
|
||||||
|
"Set preferred network list stored in a given SIM.",
|
||||||
|
"[[MCCMNC[,access_tech]],...]"
|
||||||
|
},
|
||||||
{ NULL }
|
{ NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -104,10 +109,11 @@ mmcli_sim_options_enabled (void)
|
|||||||
n_actions = (!!puk_str +
|
n_actions = (!!puk_str +
|
||||||
enable_pin_flag +
|
enable_pin_flag +
|
||||||
disable_pin_flag +
|
disable_pin_flag +
|
||||||
!!change_pin_str);
|
!!change_pin_str +
|
||||||
|
!!set_preferred_networks_str);
|
||||||
|
|
||||||
if (n_actions == 1) {
|
if (n_actions == 1) {
|
||||||
if (!pin_str) {
|
if (!pin_str && !set_preferred_networks_str) {
|
||||||
g_printerr ("error: action requires also the PIN code\n");
|
g_printerr ("error: action requires also the PIN code\n");
|
||||||
exit (EXIT_FAILURE);
|
exit (EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
@@ -309,6 +315,77 @@ change_pin_ready (MMSim *sim,
|
|||||||
mmcli_async_operation_done ();
|
mmcli_async_operation_done ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
parse_preferred_networks (GList **preferred_networks)
|
||||||
|
{
|
||||||
|
gchar **parts;
|
||||||
|
GList *preferred_nets_list = NULL;
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
|
parts = g_strsplit (set_preferred_networks_str, ",", -1);
|
||||||
|
if (parts) {
|
||||||
|
guint i;
|
||||||
|
|
||||||
|
for (i = 0; parts[i]; i++) {
|
||||||
|
MMModemAccessTechnology access_tech = MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN;
|
||||||
|
MMSimPreferredNetwork *preferred_net;
|
||||||
|
const gchar *mccmnc;
|
||||||
|
|
||||||
|
mccmnc = parts[i];
|
||||||
|
if (!mm_is_string_mccmnc (mccmnc)) {
|
||||||
|
g_printerr ("error: couldn't parse MCCMNC for preferred network: '%s'\n",
|
||||||
|
mccmnc);
|
||||||
|
exit (EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
/* if the next item is MCCMNC or is missing, omit the access technology */
|
||||||
|
if (parts[i + 1] && !mm_is_string_mccmnc (parts[i + 1])) {
|
||||||
|
i++;
|
||||||
|
access_tech = mm_common_get_access_technology_from_string (parts[i], &error);
|
||||||
|
if (error) {
|
||||||
|
g_printerr ("error: %s\n", error->message);
|
||||||
|
g_error_free (error);
|
||||||
|
exit (EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
preferred_net = mm_sim_preferred_network_new ();
|
||||||
|
mm_sim_preferred_network_set_operator_code (preferred_net, mccmnc);
|
||||||
|
mm_sim_preferred_network_set_access_technology (preferred_net, access_tech);
|
||||||
|
preferred_nets_list = g_list_append (preferred_nets_list, preferred_net);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g_strfreev (parts);
|
||||||
|
|
||||||
|
*preferred_networks = preferred_nets_list;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_preferred_networks_process_reply (gboolean result,
|
||||||
|
const GError *error)
|
||||||
|
{
|
||||||
|
if (!result) {
|
||||||
|
g_printerr ("error: couldn't set preferred networks: '%s'\n",
|
||||||
|
error ? error->message : "unknown error");
|
||||||
|
exit (EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_print ("successfully set preferred networks\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_preferred_networks_ready (MMSim *sim,
|
||||||
|
GAsyncResult *result,
|
||||||
|
gpointer nothing)
|
||||||
|
{
|
||||||
|
gboolean operation_result;
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
|
operation_result = mm_sim_set_preferred_networks_finish (sim, result, &error);
|
||||||
|
set_preferred_networks_process_reply (operation_result, error);
|
||||||
|
|
||||||
|
mmcli_async_operation_done ();
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
get_sim_ready (GObject *source,
|
get_sim_ready (GObject *source,
|
||||||
GAsyncResult *result,
|
GAsyncResult *result,
|
||||||
@@ -366,6 +443,20 @@ get_sim_ready (GObject *source,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Requesting to set preferred networks? */
|
||||||
|
if (set_preferred_networks_str) {
|
||||||
|
GList *preferred_networks = NULL;
|
||||||
|
|
||||||
|
parse_preferred_networks (&preferred_networks);
|
||||||
|
mm_sim_set_preferred_networks (ctx->sim,
|
||||||
|
preferred_networks,
|
||||||
|
ctx->cancellable,
|
||||||
|
(GAsyncReadyCallback)set_preferred_networks_ready,
|
||||||
|
NULL);
|
||||||
|
g_list_free_full (preferred_networks, (GDestroyNotify) mm_sim_preferred_network_free);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Requesting to send PIN? (always LAST check!) */
|
/* Requesting to send PIN? (always LAST check!) */
|
||||||
if (pin_str) {
|
if (pin_str) {
|
||||||
mm_sim_send_pin (ctx->sim,
|
mm_sim_send_pin (ctx->sim,
|
||||||
@@ -468,6 +559,21 @@ mmcli_sim_run_synchronous (GDBusConnection *connection)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Requesting to set preferred networks? */
|
||||||
|
if (set_preferred_networks_str) {
|
||||||
|
gboolean operation_result;
|
||||||
|
GList *preferred_networks = NULL;
|
||||||
|
|
||||||
|
parse_preferred_networks (&preferred_networks);
|
||||||
|
operation_result = mm_sim_set_preferred_networks_sync (ctx->sim,
|
||||||
|
preferred_networks,
|
||||||
|
NULL,
|
||||||
|
&error);
|
||||||
|
g_list_free_full (preferred_networks, (GDestroyNotify) mm_sim_preferred_network_free);
|
||||||
|
set_preferred_networks_process_reply (operation_result, error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Requesting to send PIN? (always LAST check!) */
|
/* Requesting to send PIN? (always LAST check!) */
|
||||||
if (pin_str) {
|
if (pin_str) {
|
||||||
gboolean operation_result;
|
gboolean operation_result;
|
||||||
|
@@ -1313,6 +1313,56 @@ mm_common_parse_key_value_string (const gchar *str,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MMModemAccessTechnology
|
||||||
|
mm_common_get_access_technology_from_string (const gchar *str,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
GError *inner_error = NULL;
|
||||||
|
MMModemAccessTechnology technologies;
|
||||||
|
gchar **technology_strings;
|
||||||
|
GFlagsClass *flags_class;
|
||||||
|
|
||||||
|
technologies = MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN;
|
||||||
|
|
||||||
|
flags_class = G_FLAGS_CLASS (g_type_class_ref (MM_TYPE_MODEM_ACCESS_TECHNOLOGY));
|
||||||
|
technology_strings = g_strsplit (str, "|", -1);
|
||||||
|
|
||||||
|
if (technology_strings) {
|
||||||
|
guint i;
|
||||||
|
|
||||||
|
for (i = 0; technology_strings[i]; i++) {
|
||||||
|
guint j;
|
||||||
|
gboolean found = FALSE;
|
||||||
|
|
||||||
|
for (j = 0; flags_class->values[j].value_nick; j++) {
|
||||||
|
if (!g_ascii_strcasecmp (technology_strings[i], flags_class->values[j].value_nick)) {
|
||||||
|
technologies |= flags_class->values[j].value;
|
||||||
|
found = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found) {
|
||||||
|
inner_error = g_error_new (
|
||||||
|
MM_CORE_ERROR,
|
||||||
|
MM_CORE_ERROR_INVALID_ARGS,
|
||||||
|
"Couldn't match '%s' with a valid MMModemAccessTechnology value",
|
||||||
|
technology_strings[i]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inner_error) {
|
||||||
|
g_propagate_error (error, inner_error);
|
||||||
|
technologies = MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_type_class_unref (flags_class);
|
||||||
|
g_strfreev (technology_strings);
|
||||||
|
return technologies;
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
@@ -1612,6 +1662,26 @@ mm_get_string_unquoted_from_match_info (GMatchInfo *match_info,
|
|||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
mm_is_string_mccmnc (const gchar *str)
|
||||||
|
{
|
||||||
|
gsize len;
|
||||||
|
guint i;
|
||||||
|
|
||||||
|
if (!str)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
len = strlen (str);
|
||||||
|
if (len < 5 || len > 6)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
for (i = 0; i < len; i++)
|
||||||
|
if (str[i] < '0' || str[i] > '9')
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
const gchar *
|
const gchar *
|
||||||
|
@@ -79,6 +79,9 @@ MMOmaSessionType mm_common_get_oma_session_type_from_string (const gchar *s
|
|||||||
MMModem3gppEpsUeModeOperation mm_common_get_eps_ue_mode_operation_from_string (const gchar *str,
|
MMModem3gppEpsUeModeOperation mm_common_get_eps_ue_mode_operation_from_string (const gchar *str,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
|
MMModemAccessTechnology mm_common_get_access_technology_from_string (const gchar *str,
|
||||||
|
GError **error);
|
||||||
|
|
||||||
GArray *mm_common_ports_variant_to_garray (GVariant *variant);
|
GArray *mm_common_ports_variant_to_garray (GVariant *variant);
|
||||||
MMModemPortInfo *mm_common_ports_variant_to_array (GVariant *variant,
|
MMModemPortInfo *mm_common_ports_variant_to_array (GVariant *variant,
|
||||||
guint *n_ports);
|
guint *n_ports);
|
||||||
@@ -178,6 +181,8 @@ gboolean mm_get_double_from_match_info (GMatchInfo *match_info,
|
|||||||
gchar *mm_get_string_unquoted_from_match_info (GMatchInfo *match_info,
|
gchar *mm_get_string_unquoted_from_match_info (GMatchInfo *match_info,
|
||||||
guint32 match_index);
|
guint32 match_index);
|
||||||
|
|
||||||
|
gboolean mm_is_string_mccmnc (const gchar *str);
|
||||||
|
|
||||||
const gchar *mm_sms_delivery_state_get_string_extended (guint delivery_state);
|
const gchar *mm_sms_delivery_state_get_string_extended (guint delivery_state);
|
||||||
|
|
||||||
gint mm_utils_hex2byte (const gchar *hex);
|
gint mm_utils_hex2byte (const gchar *hex);
|
||||||
|
Reference in New Issue
Block a user