diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-generic-gsm.c | 38 | ||||
-rw-r--r-- | src/mm-modem-base.c | 47 | ||||
-rw-r--r-- | src/mm-modem-base.h | 6 | ||||
-rw-r--r-- | src/mm-modem-gsm-card.c | 28 | ||||
-rw-r--r-- | src/mm-modem-gsm-card.h | 17 | ||||
-rw-r--r-- | src/mm-modem.c | 8 | ||||
-rw-r--r-- | src/mm-modem.h | 4 |
7 files changed, 147 insertions, 1 deletions
diff --git a/src/mm-generic-gsm.c b/src/mm-generic-gsm.c index 8c155e2b..635b7e8c 100644 --- a/src/mm-generic-gsm.c +++ b/src/mm-generic-gsm.c @@ -206,6 +206,18 @@ error_for_unlock_required (const char *unlock) } static void +get_unlock_retries_cb (MMModem *modem, + guint32 result, + GError *error, + gpointer user_data) +{ + if (!error) + mm_modem_base_set_unlock_retries (MM_MODEM_BASE (modem), result); + else + mm_modem_base_set_unlock_retries (MM_MODEM_BASE (modem), MM_MODEM_GSM_CARD_UNLOCK_RETRIES_NOT_SUPPORTED); +} + +static void pin_check_done (MMAtSerialPort *port, GString *response, GError *error, @@ -221,6 +233,11 @@ pin_check_done (MMAtSerialPort *port, if (g_str_has_prefix (str, "READY")) { mm_modem_base_set_unlock_required (MM_MODEM_BASE (info->modem), NULL); + if (MM_MODEM_GSM_CARD_GET_INTERFACE (info->modem)->get_unlock_retries) + mm_modem_base_set_unlock_retries (MM_MODEM_BASE (info->modem), 0); + else + mm_modem_base_set_unlock_retries (MM_MODEM_BASE (info->modem), + MM_MODEM_GSM_CARD_UNLOCK_RETRIES_NOT_SUPPORTED); parsed = TRUE; } else { CPinResult *iter = &unlock_results[0]; @@ -230,6 +247,10 @@ pin_check_done (MMAtSerialPort *port, if (g_str_has_prefix (str, iter->result)) { info->error = mm_mobile_error_for_code (iter->code); mm_modem_base_set_unlock_required (MM_MODEM_BASE (info->modem), iter->normalized); + mm_modem_gsm_card_get_unlock_retries (MM_MODEM_GSM_CARD (info->modem), + iter->normalized, + get_unlock_retries_cb, + NULL); parsed = TRUE; break; } @@ -241,6 +262,7 @@ pin_check_done (MMAtSerialPort *port, if (!parsed) { /* Assume unlocked if we don't recognize the pin request result */ mm_modem_base_set_unlock_required (MM_MODEM_BASE (info->modem), NULL); + mm_modem_base_set_unlock_retries (MM_MODEM_BASE (info->modem), 0); if (!info->error) { info->error = g_error_new (MM_MODEM_ERROR, @@ -1380,6 +1402,21 @@ change_pin (MMModemGsmCard *modem, } static void +get_unlock_retries (MMModemGsmCard *modem, + const char *pin_type, + MMModemUIntFn callback, + gpointer user_data) +{ + MMCallbackInfo *info = mm_callback_info_uint_new (MM_MODEM (modem), callback, user_data); + + mm_callback_info_set_result (info, + GUINT_TO_POINTER (MM_MODEM_GSM_CARD_UNLOCK_RETRIES_NOT_SUPPORTED), + NULL); + + mm_callback_info_schedule (info); +} + +static void reg_info_updated (MMGenericGsm *self, gboolean update_rs, MMModemGsmNetworkRegStatus status, @@ -3539,6 +3576,7 @@ modem_gsm_card_init (MMModemGsmCard *class) class->send_puk = send_puk; class->enable_pin = enable_pin; class->change_pin = change_pin; + class->get_unlock_retries = get_unlock_retries; } static void diff --git a/src/mm-modem-base.c b/src/mm-modem-base.c index 0a91d3f6..875ea6c4 100644 --- a/src/mm-modem-base.c +++ b/src/mm-modem-base.c @@ -43,6 +43,7 @@ typedef struct { char *plugin; char *device; char *unlock_required; + guint32 unlock_retries; guint32 ip_method; gboolean valid; MMModemState state; @@ -232,6 +233,41 @@ mm_modem_base_set_unlock_required (MMModemBase *self, const char *unlock_require g_object_notify (G_OBJECT (self), MM_MODEM_UNLOCK_REQUIRED); } +guint32 +mm_modem_base_get_unlock_retries (MMModemBase *self) +{ + g_return_val_if_fail (self != NULL, 0); + g_return_val_if_fail (MM_IS_MODEM_BASE (self), 0); + + return MM_MODEM_BASE_GET_PRIVATE (self)->unlock_retries; +} + +void +mm_modem_base_set_unlock_retries (MMModemBase *self, guint unlock_retries) +{ + MMModemBasePrivate *priv; + const char *dbus_path; + + g_return_if_fail (self != NULL); + g_return_if_fail (MM_IS_MODEM_BASE (self)); + + priv = MM_MODEM_BASE_GET_PRIVATE (self); + + /* Only do something if the value changes */ + if (priv->unlock_retries == unlock_retries) + return; + + priv->unlock_retries = unlock_retries; + + dbus_path = (const char *) g_object_get_data (G_OBJECT (self), DBUS_PATH_TAG); + if (dbus_path) { + g_message ("Modem %s: # unlock retries for %s is %d", + dbus_path, priv->unlock_required, priv->unlock_retries); + } + + g_object_notify (G_OBJECT (self), MM_MODEM_UNLOCK_RETRIES); +} + const char * mm_modem_base_get_manf (MMModemBase *self) { @@ -490,6 +526,9 @@ mm_modem_base_init (MMModemBase *self) mm_properties_changed_signal_register_property (G_OBJECT (self), MM_MODEM_UNLOCK_REQUIRED, MM_MODEM_DBUS_INTERFACE); + mm_properties_changed_signal_register_property (G_OBJECT (self), + MM_MODEM_UNLOCK_RETRIES, + MM_MODEM_DBUS_INTERFACE); } static void @@ -539,6 +578,7 @@ set_property (GObject *object, guint prop_id, case MM_MODEM_PROP_TYPE: case MM_MODEM_PROP_ENABLED: case MM_MODEM_PROP_UNLOCK_REQUIRED: + case MM_MODEM_PROP_UNLOCK_RETRIES: break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -583,6 +623,9 @@ get_property (GObject *object, guint prop_id, case MM_MODEM_PROP_UNLOCK_REQUIRED: g_value_set_string (value, priv->unlock_required); break; + case MM_MODEM_PROP_UNLOCK_RETRIES: + g_value_set_uint (value, priv->unlock_retries); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -658,6 +701,10 @@ mm_modem_base_class_init (MMModemBaseClass *klass) MM_MODEM_PROP_UNLOCK_REQUIRED, MM_MODEM_UNLOCK_REQUIRED); + g_object_class_override_property (object_class, + MM_MODEM_PROP_UNLOCK_RETRIES, + MM_MODEM_UNLOCK_RETRIES); + mm_properties_changed_signal_new (object_class); } diff --git a/src/mm-modem-base.h b/src/mm-modem-base.h index 516af2eb..8eec0e48 100644 --- a/src/mm-modem-base.h +++ b/src/mm-modem-base.h @@ -67,6 +67,12 @@ const char *mm_modem_base_get_unlock_required (MMModemBase *self); void mm_modem_base_set_unlock_required (MMModemBase *self, const char *unlock_required); +guint mm_modem_base_get_unlock_retries (MMModemBase *self); + +void mm_modem_base_set_unlock_retries (MMModemBase *self, + guint unlock_retries); + + const char *mm_modem_base_get_manf (MMModemBase *self); void mm_modem_base_set_manf (MMModemBase *self, const char *manf); diff --git a/src/mm-modem-gsm-card.c b/src/mm-modem-gsm-card.c index 432a4a3f..ca8bdcb0 100644 --- a/src/mm-modem-gsm-card.c +++ b/src/mm-modem-gsm-card.c @@ -77,6 +77,19 @@ str_call_not_supported (MMModemGsmCard *self, } static void +uint_call_not_supported (MMModemGsmCard *self, + MMModemUIntFn callback, + gpointer user_data) +{ + MMCallbackInfo *info; + + info = mm_callback_info_uint_new (MM_MODEM (self), callback, user_data); + info->error = g_error_new_literal (MM_MODEM_ERROR, MM_MODEM_ERROR_OPERATION_NOT_SUPPORTED, + "Operation not supported"); + mm_callback_info_schedule (info); +} + +static void async_call_done (MMModem *modem, GError *error, gpointer user_data) { DBusGMethodInvocation *context = (DBusGMethodInvocation *) user_data; @@ -130,6 +143,21 @@ mm_modem_gsm_card_get_imsi (MMModemGsmCard *self, str_call_not_supported (self, callback, user_data); } +void mm_modem_gsm_card_get_unlock_retries (MMModemGsmCard *self, + const char *pin_type, + MMModemUIntFn callback, + gpointer user_data) +{ + g_return_if_fail (MM_IS_MODEM_GSM_CARD (self)); + g_return_if_fail (pin_type != NULL); + g_return_if_fail (callback != NULL); + + if (MM_MODEM_GSM_CARD_GET_INTERFACE (self)->get_unlock_retries) + MM_MODEM_GSM_CARD_GET_INTERFACE (self)->get_unlock_retries (self, pin_type, callback, user_data); + else + uint_call_not_supported (self, callback, user_data); +} + void mm_modem_gsm_card_send_puk (MMModemGsmCard *self, const char *puk, diff --git a/src/mm-modem-gsm-card.h b/src/mm-modem-gsm-card.h index 4d690e65..1d1916d6 100644 --- a/src/mm-modem-gsm-card.h +++ b/src/mm-modem-gsm-card.h @@ -27,6 +27,13 @@ #define MM_MODEM_GSM_CARD_SUPPORTED_BANDS "supported-bands" #define MM_MODEM_GSM_CARD_SUPPORTED_MODES "supported-modes" +#define MM_MODEM_GSM_CARD_SIM_PIN "sim-pin" +#define MM_MODEM_GSM_CARD_SIM_PIN2 "sim-pin2" +#define MM_MODEM_GSM_CARD_SIM_PUK "sim-puk" +#define MM_MODEM_GSM_CARD_SIM_PUK2 "sim-puk2" + +#define MM_MODEM_GSM_CARD_UNLOCK_RETRIES_NOT_SUPPORTED 999 + typedef struct _MMModemGsmCard MMModemGsmCard; struct _MMModemGsmCard { @@ -41,6 +48,11 @@ struct _MMModemGsmCard { MMModemStringFn callback, gpointer user_data); + void (*get_unlock_retries) (MMModemGsmCard *self, + const char *pin_type, + MMModemUIntFn callback, + gpointer user_data); + void (*send_puk) (MMModemGsmCard *self, const char *puk, const char *pin, @@ -75,6 +87,11 @@ void mm_modem_gsm_card_get_imsi (MMModemGsmCard *self, MMModemStringFn callback, gpointer user_data); +void mm_modem_gsm_card_get_unlock_retries (MMModemGsmCard *self, + const char *pin_type, + MMModemUIntFn callback, + gpointer user_data); + void mm_modem_gsm_card_send_puk (MMModemGsmCard *self, const char *puk, const char *pin, diff --git a/src/mm-modem.c b/src/mm-modem.c index 35e3b07c..b378fffa 100644 --- a/src/mm-modem.c +++ b/src/mm-modem.c @@ -812,6 +812,14 @@ mm_modem_init (gpointer g_iface) NULL, G_PARAM_READABLE)); + g_object_interface_install_property + (g_iface, + g_param_spec_uint (MM_MODEM_UNLOCK_RETRIES, + "UnlockRetries", + "The remaining number of unlock attempts", + 0, G_MAXUINT32, 0, + G_PARAM_READABLE)); + /* Signals */ g_signal_new ("state-changed", iface_type, diff --git a/src/mm-modem.h b/src/mm-modem.h index 6eeb4dea..d2863e4a 100644 --- a/src/mm-modem.h +++ b/src/mm-modem.h @@ -59,6 +59,7 @@ typedef enum { #define MM_MODEM_IP_METHOD "ip-method" #define MM_MODEM_ENABLED "enabled" #define MM_MODEM_UNLOCK_REQUIRED "unlock-required" +#define MM_MODEM_UNLOCK_RETRIES "unlock-retries" #define MM_MODEM_VALID "valid" /* not exported */ #define MM_MODEM_PLUGIN "plugin" /* not exported */ #define MM_MODEM_STATE "state" /* not exported */ @@ -83,7 +84,8 @@ typedef enum { MM_MODEM_PROP_PLUGIN, /* Not exported */ MM_MODEM_PROP_STATE, /* Not exported */ MM_MODEM_PROP_ENABLED, - MM_MODEM_PROP_UNLOCK_REQUIRED + MM_MODEM_PROP_UNLOCK_REQUIRED, + MM_MODEM_PROP_UNLOCK_RETRIES } MMModemProp; typedef struct _MMModem MMModem; |