diff options
author | Dan Williams <dcbw@redhat.com> | 2010-02-20 12:49:22 -0800 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2010-02-20 12:49:22 -0800 |
commit | 9d8e892ffe602a123697a5f65393b5752129de09 (patch) | |
tree | c317a8cd05b62ec96f2dd7e10473ce1434e01f72 /src | |
parent | c916ea7b4b0bb56820a08b7d51f46f5357b27bfe (diff) | |
parent | 9185ce987d254aab07b0e8439a2788ce0670e59d (diff) |
Merge remote branch 'origin/master' into qcdm
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-generic-gsm.c | 39 | ||||
-rw-r--r-- | src/mm-modem-base.c | 12 | ||||
-rw-r--r-- | src/mm-modem-base.h | 2 | ||||
-rw-r--r-- | src/tests/test-modem-helpers.c | 22 |
4 files changed, 69 insertions, 6 deletions
diff --git a/src/mm-generic-gsm.c b/src/mm-generic-gsm.c index 4718d6fc..d26f1171 100644 --- a/src/mm-generic-gsm.c +++ b/src/mm-generic-gsm.c @@ -51,6 +51,8 @@ typedef struct { gboolean valid; gboolean pin_checked; + guint32 pin_check_tries; + guint pin_check_timeout; char *oper_code; char *oper_name; @@ -201,8 +203,8 @@ pin_check_done (MMSerialPort *port, if (error) info->error = g_error_copy (error); - else if (g_str_has_prefix (response->str, "+CPIN: ")) { - const char *str = response->str + 7; + else if (response && strstr (response->str, "+CPIN: ")) { + const char *str = strstr (response->str, "+CPIN: ") + 7; if (g_str_has_prefix (str, "READY")) { mm_modem_base_set_unlock_required (MM_MODEM_BASE (info->modem), NULL); @@ -297,6 +299,20 @@ check_valid (MMGenericGsm *self) mm_modem_base_set_valid (MM_MODEM_BASE (self), new_valid); } + +static void initial_pin_check_done (MMModem *modem, GError *error, gpointer user_data); + +static gboolean +pin_check_again (gpointer user_data) +{ + MMGenericGsm *self = MM_GENERIC_GSM (user_data); + MMGenericGsmPrivate *priv = MM_GENERIC_GSM_GET_PRIVATE (self); + + priv->pin_check_timeout = 0; + mm_generic_gsm_check_pin (self, initial_pin_check_done, GUINT_TO_POINTER (TRUE)); + return FALSE; +} + static void initial_pin_check_done (MMModem *modem, GError *error, gpointer user_data) { @@ -306,10 +322,20 @@ initial_pin_check_done (MMModem *modem, GError *error, gpointer user_data) /* modem could have been removed before we get here, in which case * 'modem' will be NULL. */ - if (modem) { - g_return_if_fail (MM_IS_GENERIC_GSM (modem)); - priv = MM_GENERIC_GSM_GET_PRIVATE (modem); + if (!modem) + return; + g_return_if_fail (MM_IS_GENERIC_GSM (modem)); + priv = MM_GENERIC_GSM_GET_PRIVATE (modem); + + if ( error + && priv->pin_check_tries++ < 3 + && !mm_modem_base_get_unlock_required (MM_MODEM_BASE (modem))) { + /* Try it again a few times */ + if (priv->pin_check_timeout) + g_source_remove (priv->pin_check_timeout); + priv->pin_check_timeout = g_timeout_add_seconds (2, pin_check_again, modem); + } else { priv->pin_checked = TRUE; if (close_port) mm_serial_port_close (priv->primary); @@ -2284,6 +2310,9 @@ finalize (GObject *object) mm_generic_gsm_pending_registration_stop (MM_GENERIC_GSM (object)); + if (priv->pin_check_timeout) + g_source_remove (priv->pin_check_timeout); + g_free (priv->oper_code); g_free (priv->oper_name); diff --git a/src/mm-modem-base.c b/src/mm-modem-base.c index 6e9ee75f..43ec6f84 100644 --- a/src/mm-modem-base.c +++ b/src/mm-modem-base.c @@ -170,7 +170,17 @@ mm_modem_base_get_valid (MMModemBase *self) return MM_MODEM_BASE_GET_PRIVATE (self)->valid; } -void mm_modem_base_set_unlock_required (MMModemBase *self, const char *unlock_required) +const char * +mm_modem_base_get_unlock_required (MMModemBase *self) +{ + g_return_val_if_fail (self != NULL, NULL); + g_return_val_if_fail (MM_IS_MODEM_BASE (self), NULL); + + return MM_MODEM_BASE_GET_PRIVATE (self)->unlock_required; +} + +void +mm_modem_base_set_unlock_required (MMModemBase *self, const char *unlock_required) { MMModemBasePrivate *priv; const char *dbus_path; diff --git a/src/mm-modem-base.h b/src/mm-modem-base.h index 9078f3f2..db2b5fb6 100644 --- a/src/mm-modem-base.h +++ b/src/mm-modem-base.h @@ -60,6 +60,8 @@ void mm_modem_base_set_valid (MMModemBase *self, gboolean mm_modem_base_get_valid (MMModemBase *self); +const char *mm_modem_base_get_unlock_required (MMModemBase *self); + void mm_modem_base_set_unlock_required (MMModemBase *self, const char *unlock_required); diff --git a/src/tests/test-modem-helpers.c b/src/tests/test-modem-helpers.c index 3d93423e..f5b4b6a8 100644 --- a/src/tests/test-modem-helpers.c +++ b/src/tests/test-modem-helpers.c @@ -409,6 +409,27 @@ test_cops_response_gobi (void *f, gpointer d) } static void +test_cops_response_sek600i (void *f, gpointer d) +{ + /* Phone is stupid enough to support 3G but not report cell technology, + * mixing together 2G and 3G cells without any way of distinguishing + * which is which... + */ + const char *reply = "+COPS: (2,\"blau\",\"\",\"26203\"),(2,\"blau\",\"\",\"26203\"),(3,\"\",\"\",\"26201\"),(3,\"\",\"\",\"26202\"),(3,\"\",\"\",\"26207\"),(3,\"\",\"\",\"26201\"),(3,\"\",\"\",\"26207\")"; + static OperEntry expected[] = { + { "2", "blau", NULL, "26203", NULL }, + { "2", "blau", NULL, "26203", NULL }, + { "3", NULL, NULL, "26201", NULL }, + { "3", NULL, NULL, "26202", NULL }, + { "3", NULL, NULL, "26207", NULL }, + { "3", NULL, NULL, "26201", NULL }, + { "3", NULL, NULL, "26207", NULL }, + }; + + test_results ("Sony-Ericsson K600i", reply, &expected[0], ARRAY_LEN (expected)); +} + +static void test_cops_response_gsm_invalid (void *f, gpointer d) { const char *reply = "+COPS: (0,1,2,3),(1,2,3,4)"; @@ -470,6 +491,7 @@ int main (int argc, char **argv) g_test_suite_add (suite, TESTCASE (test_cops_response_gtultraexpress, NULL)); g_test_suite_add (suite, TESTCASE (test_cops_response_n2720, NULL)); g_test_suite_add (suite, TESTCASE (test_cops_response_gobi, NULL)); + g_test_suite_add (suite, TESTCASE (test_cops_response_sek600i, NULL)); g_test_suite_add (suite, TESTCASE (test_cops_response_gsm_invalid, NULL)); g_test_suite_add (suite, TESTCASE (test_cops_response_umts_invalid, NULL)); |