Fix issue with some modems preventing to update elementary files (speedup, ZTE, huawei, MBM) --- drivers/atmodem/sim.c | 52 ++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 45 insertions(+), 7 deletions(-)
diff --git a/drivers/atmodem/sim.c b/drivers/atmodem/sim.c index 8ee9822..f307708 100644 --- a/drivers/atmodem/sim.c +++ b/drivers/atmodem/sim.c @@ -305,18 +305,38 @@ static void at_sim_update_binary(struct ofono_sim *sim, int fileid, { struct sim_data *sd = ofono_sim_get_data(sim); struct cb_data *cbd = cb_data_new(cb, data); - char *buf = g_try_new(char, 36 + length * 2); + char *buf; int len, ret; + int size = 36 + length * 2; + if (sd->vendor == OFONO_VENDOR_MBM || + sd->vendor == OFONO_VENDOR_ZTE || + sd->vendor == OFONO_VENDOR_HUAWEI || + sd->vendor == OFONO_VENDOR_SPEEDUP) + size += 2; /*Add quotes*/ + + buf = g_try_new(char, size); if (buf == NULL) goto error; len = sprintf(buf, "AT+CRSM=214,%i,%i,%i,%i,", fileid, start >> 8, start & 0xff, length); + if (sd->vendor == OFONO_VENDOR_MBM || + sd->vendor == OFONO_VENDOR_ZTE || + sd->vendor == OFONO_VENDOR_HUAWEI || + sd->vendor == OFONO_VENDOR_SPEEDUP) + sprintf(buf + len, "\""); + for (; length; length--) len += sprintf(buf + len, "%02hhX", *value++); + if (sd->vendor == OFONO_VENDOR_MBM || + sd->vendor == OFONO_VENDOR_ZTE || + sd->vendor == OFONO_VENDOR_HUAWEI || + sd->vendor == OFONO_VENDOR_SPEEDUP) + sprintf(buf + len, "\""); + ret = g_at_chat_send(sd->chat, buf, crsm_prefix, at_crsm_update_cb, cbd, g_free); @@ -342,7 +362,10 @@ static void at_sim_update_record(struct ofono_sim *sim, int fileid, int len, ret; int size = 36 + length * 2; - if (sd->vendor == OFONO_VENDOR_MBM) + if (sd->vendor == OFONO_VENDOR_MBM || + sd->vendor == OFONO_VENDOR_ZTE || + sd->vendor == OFONO_VENDOR_HUAWEI || + sd->vendor == OFONO_VENDOR_SPEEDUP) size += 2; /*Add quotes*/ buf = g_try_new(char, size); @@ -352,13 +375,19 @@ static void at_sim_update_record(struct ofono_sim *sim, int fileid, len = sprintf(buf, "AT+CRSM=220,%i,%i,4,%i,", fileid, record, length); - if (sd->vendor == OFONO_VENDOR_MBM) + if (sd->vendor == OFONO_VENDOR_MBM || + sd->vendor == OFONO_VENDOR_ZTE || + sd->vendor == OFONO_VENDOR_HUAWEI || + sd->vendor == OFONO_VENDOR_SPEEDUP) len += sprintf(buf + len, "\""); for (; length; length--) len += sprintf(buf + len, "%02hhX", *value++); - if (sd->vendor == OFONO_VENDOR_MBM) + if (sd->vendor == OFONO_VENDOR_MBM || + sd->vendor == OFONO_VENDOR_ZTE || + sd->vendor == OFONO_VENDOR_HUAWEI || + sd->vendor == OFONO_VENDOR_SPEEDUP) sprintf(buf + len, "\""); ret = g_at_chat_send(sd->chat, buf, crsm_prefix, @@ -385,7 +414,10 @@ static void at_sim_update_cyclic(struct ofono_sim *sim, int fileid, int len, ret; int size = 36 + length * 2; - if (sd->vendor == OFONO_VENDOR_MBM) + if (sd->vendor == OFONO_VENDOR_MBM || + sd->vendor == OFONO_VENDOR_ZTE || + sd->vendor == OFONO_VENDOR_HUAWEI || + sd->vendor == OFONO_VENDOR_SPEEDUP) size += 2; /* Add quotes */ buf = g_try_new(char, size); @@ -394,13 +426,19 @@ static void at_sim_update_cyclic(struct ofono_sim *sim, int fileid, len = sprintf(buf, "AT+CRSM=220,%i,0,3,%i,", fileid, length); - if (sd->vendor == OFONO_VENDOR_MBM) + if (sd->vendor == OFONO_VENDOR_MBM || + sd->vendor == OFONO_VENDOR_ZTE || + sd->vendor == OFONO_VENDOR_HUAWEI || + sd->vendor == OFONO_VENDOR_SPEEDUP) len += sprintf(buf + len, "\""); for (; length; length--) len += sprintf(buf + len, "%02hhX", *value++); - if (sd->vendor == OFONO_VENDOR_MBM) + if (sd->vendor == OFONO_VENDOR_MBM || + sd->vendor == OFONO_VENDOR_ZTE || + sd->vendor == OFONO_VENDOR_HUAWEI || + sd->vendor == OFONO_VENDOR_SPEEDUP) sprintf(buf + len, "\""); ret = g_at_chat_send(sd->chat, buf, crsm_prefix, -- 1.7.5.4 _______________________________________________ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono