base-sim: implement GID1 and GID2 loading using AT commands
This commit is contained in:
@@ -12,7 +12,8 @@
|
|||||||
*
|
*
|
||||||
* Copyright (C) 2008 - 2009 Novell, Inc.
|
* Copyright (C) 2008 - 2009 Novell, Inc.
|
||||||
* Copyright (C) 2009 - 2011 Red Hat, Inc.
|
* Copyright (C) 2009 - 2011 Red Hat, Inc.
|
||||||
* Copyright (C) 2011 Google, Inc.
|
* Copyright (C) 2011 - 2022 Aleksander Morgado <aleksander@aleksander.es>
|
||||||
|
* Copyright (C) 2011 - 2022 Google, Inc.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
@@ -2286,6 +2287,90 @@ load_operator_name (MMBaseSim *self,
|
|||||||
g_task_new (self, NULL, callback, user_data));
|
g_task_new (self, NULL, callback, user_data));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* GID1 and GID2 */
|
||||||
|
|
||||||
|
static GByteArray *
|
||||||
|
parse_gid (const gchar *response,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
guint sw1 = 0;
|
||||||
|
guint sw2 = 0;
|
||||||
|
g_autofree gchar *hex = NULL;
|
||||||
|
|
||||||
|
if (!mm_3gpp_parse_crsm_response (response, &sw1, &sw2, &hex, error))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if ((sw1 == 0x90 && sw2 == 0x00) ||
|
||||||
|
(sw1 == 0x91) ||
|
||||||
|
(sw1 == 0x92) ||
|
||||||
|
(sw1 == 0x9f)) {
|
||||||
|
guint8 *bin = NULL;
|
||||||
|
gsize binlen = 0;
|
||||||
|
|
||||||
|
/* Convert hex string to binary */
|
||||||
|
bin = mm_utils_hexstr2bin (hex, -1, &binlen, error);
|
||||||
|
if (!bin) {
|
||||||
|
g_prefix_error (error, "SIM returned malformed response '%s': ", hex);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* return as bytearray */
|
||||||
|
return g_byte_array_new_take (bin, binlen);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
|
||||||
|
"SIM failed to handle CRSM request (sw1 %d sw2 %d)", sw1, sw2);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GByteArray *
|
||||||
|
common_load_gid_finish (MMBaseSim *self,
|
||||||
|
GAsyncResult *res,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
g_autofree gchar *result = NULL;
|
||||||
|
|
||||||
|
result = g_task_propagate_pointer (G_TASK (res), error);
|
||||||
|
if (!result)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return parse_gid (result, error);
|
||||||
|
}
|
||||||
|
|
||||||
|
STR_REPLY_READY_FN (load_gid1)
|
||||||
|
STR_REPLY_READY_FN (load_gid2)
|
||||||
|
|
||||||
|
static void
|
||||||
|
load_gid1 (MMBaseSim *self,
|
||||||
|
GAsyncReadyCallback callback,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
/* READ BINARY of EFgid1 */
|
||||||
|
mm_base_modem_at_command (
|
||||||
|
self->priv->modem,
|
||||||
|
"+CRSM=176,28478,0,0,15",
|
||||||
|
10,
|
||||||
|
FALSE,
|
||||||
|
(GAsyncReadyCallback)load_gid1_command_ready,
|
||||||
|
g_task_new (self, NULL, callback, user_data));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
load_gid2 (MMBaseSim *self,
|
||||||
|
GAsyncReadyCallback callback,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
/* READ BINARY of EFgid2 */
|
||||||
|
mm_base_modem_at_command (
|
||||||
|
self->priv->modem,
|
||||||
|
"+CRSM=176,28479,0,0,15",
|
||||||
|
10,
|
||||||
|
FALSE,
|
||||||
|
(GAsyncReadyCallback)load_gid2_command_ready,
|
||||||
|
g_task_new (self, NULL, callback, user_data));
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
MMBaseSim *
|
MMBaseSim *
|
||||||
@@ -3059,6 +3144,10 @@ mm_base_sim_class_init (MMBaseSimClass *klass)
|
|||||||
klass->load_emergency_numbers_finish = load_emergency_numbers_finish;
|
klass->load_emergency_numbers_finish = load_emergency_numbers_finish;
|
||||||
klass->load_preferred_networks = load_preferred_networks;
|
klass->load_preferred_networks = load_preferred_networks;
|
||||||
klass->load_preferred_networks_finish = load_preferred_networks_finish;
|
klass->load_preferred_networks_finish = load_preferred_networks_finish;
|
||||||
|
klass->load_gid1 = load_gid1;
|
||||||
|
klass->load_gid1_finish = common_load_gid_finish;
|
||||||
|
klass->load_gid2 = load_gid2;
|
||||||
|
klass->load_gid2_finish = common_load_gid_finish;
|
||||||
klass->set_preferred_networks = set_preferred_networks;
|
klass->set_preferred_networks = set_preferred_networks;
|
||||||
klass->set_preferred_networks_finish = set_preferred_networks_finish;
|
klass->set_preferred_networks_finish = set_preferred_networks_finish;
|
||||||
klass->send_pin = send_pin;
|
klass->send_pin = send_pin;
|
||||||
|
Reference in New Issue
Block a user