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

Reply via email to