diff options
author | Philippe Nunes <philippe.nunes@linux.intel.com> | 2012-04-06 11:47:32 +0200 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2012-04-06 11:05:48 -0500 |
commit | 09449f1e663a521f944ddb38f4e5b23940d7a7d2 (patch) | |
tree | fa8425ed068a95c059b1ceff0138a3f0a8c81253 | |
parent | de29df012f110f6c40581548daef6774344b5f8f (diff) | |
download | ofono-09449f1e663a521f944ddb38f4e5b23940d7a7d2.tar.bz2 |
sms: Add ZTE quirk for CDS notifications
-rw-r--r-- | drivers/atmodem/sms.c | 37 |
1 files changed, 28 insertions, 9 deletions
diff --git a/drivers/atmodem/sms.c b/drivers/atmodem/sms.c index c31eb397..27dc2c04 100644 --- a/drivers/atmodem/sms.c +++ b/drivers/atmodem/sms.c @@ -319,17 +319,16 @@ static void at_cnma_cb(gboolean ok, GAtResult *result, gpointer user_data) "Further SMS reception is not guaranteed"); } -static gboolean at_parse_pdu_common(GAtResult *result, const char *prefix, - const char **pdu, int *pdulen) +static gboolean at_parse_cmt(GAtResult *result, const char **pdu, int *pdulen) { GAtResultIter iter; g_at_result_iter_init(&iter, result); - if (!g_at_result_iter_next(&iter, prefix)) + if (!g_at_result_iter_next(&iter, "+CMT:")) return FALSE; - if (!strcmp(prefix, "+CMT:") && !g_at_result_iter_skip_next(&iter)) + if (!g_at_result_iter_skip_next(&iter)) return FALSE; if (!g_at_result_iter_next_number(&iter, pdulen)) @@ -365,11 +364,26 @@ static void at_cds_notify(GAtResult *result, gpointer user_data) int tpdu_len; const char *hexpdu; unsigned char pdu[176]; + GAtResultIter iter; - if (!at_parse_pdu_common(result, "+CDS:", &hexpdu, &tpdu_len)) { - ofono_error("Unable to parse CDS notification"); - return; - } + g_at_result_iter_init(&iter, result); + + if (!g_at_result_iter_next(&iter, "+CDS:")) + goto err; + + /* + * Quirk for ZTE firmware which is not compliant with 27.005 + * The +CDS syntax used by ZTE is including a comma before the length + * +CDS: ,<length><CR><LF><pdu> + * As a result, we need to skip this omitted subparameter + */ + if (data->vendor == OFONO_VENDOR_ZTE) + g_at_result_iter_skip_next(&iter); + + if (!g_at_result_iter_next_number(&iter, &tpdu_len)) + goto err; + + hexpdu = g_at_result_pdu(result); if (strlen(hexpdu) > sizeof(pdu) * 2) { ofono_error("Bad PDU length in CDS notification"); @@ -384,6 +398,11 @@ static void at_cds_notify(GAtResult *result, gpointer user_data) if (data->cnma_enabled) at_ack_delivery(sms); + + return; + +err: + ofono_error("Unable to parse CDS notification"); } static void at_cmt_notify(GAtResult *result, gpointer user_data) @@ -395,7 +414,7 @@ static void at_cmt_notify(GAtResult *result, gpointer user_data) int tpdu_len; unsigned char pdu[176]; - if (!at_parse_pdu_common(result, "+CMT:", &hexpdu, &tpdu_len)) { + if (!at_parse_cmt(result, &hexpdu, &tpdu_len)) { ofono_error("Unable to parse CMT notification"); return; } |