summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2010-02-08 16:13:43 -0600
committerDenis Kenzior <denkenz@gmail.com>2010-02-08 16:13:43 -0600
commit6d28f82dc1ccb3de3a028a88eafb96fb001c7e61 (patch)
treec6b640ff78248444e62b60a773c19bffdbb7a061 /drivers
parentea771ec186613c365a5404c6c178db512f651795 (diff)
downloadofono-6d28f82dc1ccb3de3a028a88eafb96fb001c7e61.tar.bz2
Add Wavecom's quirky CPIN handling
Diffstat (limited to 'drivers')
-rw-r--r--drivers/atmodem/sim.c29
-rw-r--r--drivers/atmodem/vendor.h1
2 files changed, 23 insertions, 7 deletions
diff --git a/drivers/atmodem/sim.c b/drivers/atmodem/sim.c
index d8d656bc..89ddcc67 100644
--- a/drivers/atmodem/sim.c
+++ b/drivers/atmodem/sim.c
@@ -425,6 +425,7 @@ static struct {
static void at_cpin_cb(gboolean ok, GAtResult *result, gpointer user_data)
{
struct cb_data *cbd = user_data;
+ struct sim_data *sd = ofono_sim_get_data(cbd->user);
GAtResultIter iter;
ofono_sim_passwd_cb_t cb = cbd->cb;
struct ofono_error error;
@@ -432,22 +433,31 @@ static void at_cpin_cb(gboolean ok, GAtResult *result, gpointer user_data)
int pin_type = OFONO_SIM_PASSWORD_INVALID;
int i;
int len = sizeof(at_sim_name) / sizeof(*at_sim_name);
+ const char *final = g_at_result_final_response(result);
- decode_at_error(&error, g_at_result_final_response(result));
+ if (sd->vendor == OFONO_VENDOR_WAVECOM && ok && strlen(final) > 7)
+ decode_at_error(&error, "OK");
+ else
+ decode_at_error(&error, final);
if (!ok) {
cb(&error, -1, cbd->data);
return;
}
- g_at_result_iter_init(&iter, result);
+ if (sd->vendor == OFONO_VENDOR_WAVECOM) {
+ /* +CPIN: <pin> */
+ pin_required = final + 7;
+ } else {
+ g_at_result_iter_init(&iter, result);
- if (!g_at_result_iter_next(&iter, "+CPIN:")) {
- CALLBACK_WITH_FAILURE(cb, -1, cbd->data);
- return;
- }
+ if (!g_at_result_iter_next(&iter, "+CPIN:")) {
+ CALLBACK_WITH_FAILURE(cb, -1, cbd->data);
+ return;
+ }
- g_at_result_iter_next_unquoted_string(&iter, &pin_required);
+ g_at_result_iter_next_unquoted_string(&iter, &pin_required);
+ }
for (i = 0; i < len; i++) {
if (strcmp(pin_required, at_sim_name[i].name))
@@ -476,6 +486,8 @@ static void at_pin_query(struct ofono_sim *sim, ofono_sim_passwd_cb_t cb,
if (!cbd)
goto error;
+ cbd->user = sim;
+
if (g_at_chat_send(sd->chat, "AT+CPIN?", NULL,
at_cpin_cb, cbd, g_free) > 0)
return;
@@ -792,6 +804,9 @@ static int at_sim_probe(struct ofono_sim *sim, unsigned int vendor,
sd->chat = chat;
sd->vendor = vendor;
+ if (sd->vendor == OFONO_VENDOR_WAVECOM)
+ g_at_chat_add_terminator(chat, "+CPIN:", 6, TRUE);
+
ofono_sim_set_data(sim, sd);
g_idle_add(at_sim_register, sim);
diff --git a/drivers/atmodem/vendor.h b/drivers/atmodem/vendor.h
index e28ec92c..ef0f31c7 100644
--- a/drivers/atmodem/vendor.h
+++ b/drivers/atmodem/vendor.h
@@ -26,4 +26,5 @@ enum ofono_vendor {
OFONO_VENDOR_QUALCOMM_MSM,
OFONO_VENDOR_OPTION_HSO,
OFONO_VENDOR_HUAWEI,
+ OFONO_VENDOR_WAVECOM,
};