aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTorsten Hilbrich <torsten.hilbrich@secunet.com>2014-11-12 12:45:38 +0100
committerAleksander Morgado <aleksander@aleksander.es>2014-11-12 13:13:11 +0100
commitbc410ce03f6bfbfc970a89d79f200cece4c582de (patch)
tree87ea1ce1c104376cbce195b7041bb0dfbd7fb0ce /src
parentd44690489b57969bfdc44ebfcbfefce6cf3c5b42 (diff)
qmi: retrieve MM_MODEM_3GPP_FACILITY_SIM
This facility cannot be retrieved via 'DMS UIM Get CK Status' and seems currently unimplemented for mm-broadband-modem-qmi. The SIM enabled status is however available via 'DMS UIM Get PIN Status'. Using this message to add the retrieval of PIN status just after the other facilities were queried. Succesfully tested with Gobi2000 (05c6:9205), both retrieval of 3gpp SIM lock status and enabling/disabling the PIN.
Diffstat (limited to 'src')
-rw-r--r--src/mm-broadband-modem-qmi.c68
-rw-r--r--src/mm-modem-helpers-qmi.c26
-rw-r--r--src/mm-modem-helpers-qmi.h1
3 files changed, 90 insertions, 5 deletions
diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c
index 4021b561..849bf923 100644
--- a/src/mm-broadband-modem-qmi.c
+++ b/src/mm-broadband-modem-qmi.c
@@ -3347,6 +3347,68 @@ modem_3gpp_load_enabled_facility_locks_finish (MMIfaceModem3gpp *self,
}
static void
+get_sim_lock_status_via_pin_status_ready (QmiClientDms *client,
+ GAsyncResult *res,
+ LoadEnabledFacilityLocksContext *ctx)
+{
+ QmiMessageDmsUimGetPinStatusOutput *output;
+ gboolean enabled;
+
+ output = qmi_client_dms_uim_get_pin_status_finish (client, res, NULL);
+ if (!output ||
+ !qmi_message_dms_uim_get_pin_status_output_get_result (output, NULL)) {
+ mm_dbg ("Couldn't query PIN status, assuming SIM PIN is disabled");
+ enabled = FALSE;
+ } else {
+ QmiDmsUimPinStatus current_status;
+
+ if (qmi_message_dms_uim_get_pin_status_output_get_pin1_status (
+ output,
+ &current_status,
+ NULL, /* verify_retries_left */
+ NULL, /* unblock_retries_left */
+ NULL)) {
+ enabled = mm_pin_enabled_from_qmi_uim_pin_status (current_status);
+ mm_dbg ("PIN is reported %s", (enabled ? "enabled" : "disabled"));
+ } else {
+ mm_dbg ("Couldn't find PIN1 status in the result, assuming SIM PIN is disabled");
+ enabled = FALSE;
+ }
+ }
+
+ if (output)
+ qmi_message_dms_uim_get_pin_status_output_unref (output);
+
+ if (enabled) {
+ ctx->locks |= (MM_MODEM_3GPP_FACILITY_SIM);
+ } else {
+ ctx->locks &= ~(MM_MODEM_3GPP_FACILITY_SIM);
+ }
+
+ /* No more facilities to query, all done */
+ g_simple_async_result_set_op_res_gpointer (ctx->result,
+ GUINT_TO_POINTER (ctx->locks),
+ NULL);
+ load_enabled_facility_locks_context_complete_and_free (ctx);
+}
+
+/* the SIM lock cannot be queried with the qmi_get_ck_status function,
+ * therefore using the PIN status */
+static void
+get_sim_lock_status_via_pin_status (LoadEnabledFacilityLocksContext *ctx)
+{
+ mm_dbg ("Retrieving PIN status to check for enabled PIN");
+ /* if the SIM is locked or not can only be queried by locking at
+ * the PIN status */
+ qmi_client_dms_uim_get_pin_status (QMI_CLIENT_DMS (ctx->client),
+ NULL,
+ 5,
+ NULL,
+ (GAsyncReadyCallback)get_sim_lock_status_via_pin_status_ready,
+ ctx);
+}
+
+static void
dms_uim_get_ck_status_ready (QmiClientDms *client,
GAsyncResult *res,
LoadEnabledFacilityLocksContext *ctx)
@@ -3424,11 +3486,7 @@ get_next_facility_lock_status (LoadEnabledFacilityLocksContext *ctx)
}
}
- /* No more facilities to query, all done */
- g_simple_async_result_set_op_res_gpointer (ctx->result,
- GUINT_TO_POINTER (ctx->locks),
- NULL);
- load_enabled_facility_locks_context_complete_and_free (ctx);
+ get_sim_lock_status_via_pin_status (ctx);
}
static void
diff --git a/src/mm-modem-helpers-qmi.c b/src/mm-modem-helpers-qmi.c
index c673697f..7e385320 100644
--- a/src/mm-modem-helpers-qmi.c
+++ b/src/mm-modem-helpers-qmi.c
@@ -98,6 +98,32 @@ mm_modem_lock_from_qmi_uim_pin_status (QmiDmsUimPinStatus status,
/*****************************************************************************/
+gboolean
+mm_pin_enabled_from_qmi_uim_pin_status (QmiDmsUimPinStatus status)
+{
+ switch (status) {
+ case QMI_DMS_UIM_PIN_STATUS_ENABLED_NOT_VERIFIED:
+ case QMI_DMS_UIM_PIN_STATUS_ENABLED_VERIFIED:
+ case QMI_DMS_UIM_PIN_STATUS_BLOCKED:
+ case QMI_DMS_UIM_PIN_STATUS_PERMANENTLY_BLOCKED:
+ case QMI_DMS_UIM_PIN_STATUS_UNBLOCKED:
+ case QMI_DMS_UIM_PIN_STATUS_CHANGED:
+ /* assume the PIN to be enabled then */
+ return TRUE;
+
+ case QMI_DMS_UIM_PIN_STATUS_DISABLED:
+ case QMI_DMS_UIM_PIN_STATUS_NOT_INITIALIZED:
+ /* assume the PIN to be disabled then */
+ return FALSE;
+
+ default:
+ /* by default assume disabled */
+ return FALSE;
+ }
+}
+
+/*****************************************************************************/
+
QmiDmsUimFacility
mm_3gpp_facility_to_qmi_uim_facility (MMModem3gppFacility mm)
{
diff --git a/src/mm-modem-helpers-qmi.h b/src/mm-modem-helpers-qmi.h
index fb3ef8d2..a19851fd 100644
--- a/src/mm-modem-helpers-qmi.h
+++ b/src/mm-modem-helpers-qmi.h
@@ -31,6 +31,7 @@ MMModemMode mm_modem_mode_from_qmi_radio_interface (QmiDmsRadioInterface network
MMModemLock mm_modem_lock_from_qmi_uim_pin_status (QmiDmsUimPinStatus status,
gboolean pin1);
+gboolean mm_pin_enabled_from_qmi_uim_pin_status (QmiDmsUimPinStatus status);
QmiDmsUimFacility mm_3gpp_facility_to_qmi_uim_facility (MMModem3gppFacility mm);
GArray *mm_modem_bands_from_qmi_band_capabilities (QmiDmsBandCapability qmi_bands,