aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2010-02-20 12:49:22 -0800
committerDan Williams <dcbw@redhat.com>2010-02-20 12:49:22 -0800
commit9d8e892ffe602a123697a5f65393b5752129de09 (patch)
treec317a8cd05b62ec96f2dd7e10473ce1434e01f72 /src
parentc916ea7b4b0bb56820a08b7d51f46f5357b27bfe (diff)
parent9185ce987d254aab07b0e8439a2788ce0670e59d (diff)
Merge remote branch 'origin/master' into qcdm
Diffstat (limited to 'src')
-rw-r--r--src/mm-generic-gsm.c39
-rw-r--r--src/mm-modem-base.c12
-rw-r--r--src/mm-modem-base.h2
-rw-r--r--src/tests/test-modem-helpers.c22
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));