From: Jessica Nilsson <jessica.j.nils...@stericsson.com>

---
 drivers/isimodem/debug.c   |    1 +
 drivers/isimodem/devinfo.c |  161 ++++++++++++++++++++++++++++++++++++--------
 drivers/isimodem/info.h    |    3 +
 3 files changed, 136 insertions(+), 29 deletions(-)

diff --git a/drivers/isimodem/debug.c b/drivers/isimodem/debug.c
index c14acc2..10d0201 100644
--- a/drivers/isimodem/debug.c
+++ b/drivers/isimodem/debug.c
@@ -481,6 +481,7 @@ const char *info_message_id_name(enum info_message_id value)
 const char *info_subblock_name(enum info_subblock value)
 {
        switch (value) {
+               _(INFO_SB_MODEMSW_VERSION);
                _(INFO_SB_PRODUCT_INFO_NAME);
                _(INFO_SB_PRODUCT_INFO_MANUFACTURER);
                _(INFO_SB_SN_IMEI_PLAIN);
diff --git a/drivers/isimodem/devinfo.c b/drivers/isimodem/devinfo.c
index 3bf05f4..ebe4273 100644
--- a/drivers/isimodem/devinfo.c
+++ b/drivers/isimodem/devinfo.c
@@ -3,6 +3,7 @@
  *  oFono - Open Source Telephony
  *
  *  Copyright (C) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+ *  Copyright (C) ST-Ericsson SA 2011.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -46,6 +47,8 @@
 
 struct devinfo_data {
        GIsiClient *client;
+       GIsiClient *primary;
+       GIsiClient *secondary;
 };
 
 static void info_resp_cb(const GIsiMessage *msg, void *data)
@@ -82,7 +85,8 @@ static void info_resp_cb(const GIsiMessage *msg, void *data)
                if (id != INFO_SB_PRODUCT_INFO_MANUFACTURER &&
                                id != INFO_SB_PRODUCT_INFO_NAME &&
                                id != INFO_SB_MCUSW_VERSION &&
-                               id != INFO_SB_SN_IMEI_PLAIN)
+                               id != INFO_SB_SN_IMEI_PLAIN &&
+                               id != INFO_SB_MODEMSW_VERSION)
                        continue;
 
                if (g_isi_sb_iter_get_len(&iter) < 5)
@@ -111,17 +115,22 @@ static void isi_query_manufacturer(struct ofono_devinfo 
*info,
        struct devinfo_data *dev = ofono_devinfo_get_data(info);
        struct isi_cb_data *cbd = isi_cb_data_new(dev, cb, data);
 
+       if (cbd == NULL || dev == NULL)
+               goto error;
+
+       if (g_isi_client_resource(dev->client) == PN_MODEM_INFO) {
+               goto error;
+       } else {
+
        const uint8_t msg[] = {
                INFO_PRODUCT_INFO_READ_REQ,
                INFO_PRODUCT_MANUFACTURER
        };
        size_t len = sizeof(msg);
 
-       if (cbd == NULL || dev == NULL)
-               goto error;
-
        if (g_isi_client_send(dev->client, msg, len, info_resp_cb, cbd, g_free))
                return;
+       }
 
 error:
        CALLBACK_WITH_FAILURE(cb, "", data);
@@ -135,17 +144,22 @@ static void isi_query_model(struct ofono_devinfo *info,
        struct devinfo_data *dev = ofono_devinfo_get_data(info);
        struct isi_cb_data *cbd = isi_cb_data_new(dev, cb, data);
 
+       if (cbd == NULL || dev == NULL)
+               goto error;
+
+       if (g_isi_client_resource(dev->client) == PN_MODEM_INFO) {
+               goto error;
+       } else {
+
        const uint8_t msg[] = {
                INFO_PRODUCT_INFO_READ_REQ,
                INFO_PRODUCT_NAME
        };
        size_t len = sizeof(msg);
 
-       if (cbd == NULL || dev == NULL)
-               goto error;
-
        if (g_isi_client_send(dev->client, msg, len, info_resp_cb, cbd, g_free))
                return;
+       }
 
 error:
        CALLBACK_WITH_FAILURE(cb, "", data);
@@ -159,24 +173,51 @@ static void isi_query_revision(struct ofono_devinfo *info,
        struct devinfo_data *dev = ofono_devinfo_get_data(info);
        struct isi_cb_data *cbd = isi_cb_data_new(dev, cb, data);
 
-       const uint8_t msg[] = {
-               INFO_VERSION_READ_REQ,
-               0x00, INFO_MCUSW,
-               0x00, 0x00, 0x00, 0x00
-       };
-       size_t len = sizeof(msg);
+       unsigned char *msg = NULL;
+       unsigned char msg_size = 0;
+       size_t len;
 
        if (cbd == NULL || dev == NULL)
                goto error;
 
+       if (g_isi_client_resource(dev->client) == PN_MODEM_INFO) {
+               goto error;
+       } else {
+               msg_size = 7;
+               msg = g_try_malloc0(msg_size);
+               msg[0] = INFO_VERSION_READ_REQ;
+               msg[1] = 0x00;
+               msg[2] = INFO_MCUSW;
+               msg[3] = 0x00;
+               msg[4] = 0x00;
+               msg[5] = 0x00;
+               msg[6] = 0x00;
+       }
+
+       len = sizeof(msg);
+
        if (g_isi_client_send(dev->client, msg, len, info_resp_cb, cbd, g_free))
-               return;
+               goto out;
 
 error:
        CALLBACK_WITH_FAILURE(cb, "", data);
+out:
+       g_free(msg);
        g_free(cbd);
 }
 
+static gboolean send_serial_number_read_req(GIsiClient *client, void *cbd,
+                                       GDestroyNotify destroy)
+{
+       const uint8_t msg[] = {
+               INFO_SERIAL_NUMBER_READ_REQ,
+               INFO_SN_IMEI_PLAIN
+       };
+
+       return g_isi_client_send(client, msg, sizeof(msg),
+                                       info_resp_cb, cbd, g_free);
+
+}
 static void isi_query_serial(struct ofono_devinfo *info,
                                ofono_devinfo_query_cb_t cb,
                                void *data)
@@ -184,33 +225,84 @@ static void isi_query_serial(struct ofono_devinfo *info,
        struct devinfo_data *dev = ofono_devinfo_get_data(info);
        struct isi_cb_data *cbd = isi_cb_data_new(dev, cb, data);
 
-       const uint8_t msg[] = {
-               INFO_SERIAL_NUMBER_READ_REQ,
-               INFO_SN_IMEI_PLAIN
-       };
-       size_t len = sizeof(msg);
+               if (cbd == NULL || dev == NULL)
+                       goto error;
 
-       if (cbd == NULL || dev == NULL)
-               goto error;
+/* FIXME Move to u8500 */
+       if (g_isi_client_resource(dev->client) == PN_MODEM_INFO) {
+               char imei[16]; /* IMEI 15 digits + 1 null*/
+               char numbers[] = "1234567890";
+               FILE *fp = fopen("/etc/imei", "r");
+               DBG("");
 
-       if (g_isi_client_send(dev->client, msg, len, info_resp_cb, cbd, g_free))
+               if (fp == NULL) {
+                       DBG("failed to open /etc/imei file");
+                       goto error;
+               }
+
+               if (fgets(imei, 16, fp)) {
+                       DBG(" IMEI = %s", imei);
+                       if (15 == strspn(imei, numbers))
+                               CALLBACK_WITH_SUCCESS(cb, imei, data);
+                       else {
+                               CALLBACK_WITH_FAILURE(cb, "", data);
+                               fclose(fp);
+                               goto error;
+                       }
+               }
+
+               fclose(fp);
+               g_free(cbd);
                return;
+       } else {
+               if (send_serial_number_read_req(dev->client, cbd, g_free))
+                       return;
+
+       }
 
 error:
        CALLBACK_WITH_FAILURE(cb, "", data);
        g_free(cbd);
 }
 
-static void reachable_cb(const GIsiMessage *msg, void *data)
+static void primary_reachable_cb(const GIsiMessage *msg, void *data)
+{
+       struct ofono_devinfo *info = data;
+       struct devinfo_data *dev = ofono_devinfo_get_data(info);
+
+       if (g_isi_msg_error(msg) < 0)
+               return;
+
+       ISI_VERSION_DBG(msg);
+
+       if (dev == NULL || dev->client != NULL)
+               return;
+
+       dev->client = dev->primary;
+
+       ofono_devinfo_register(info);
+       g_isi_client_destroy(dev->secondary);
+
+}
+
+static void secondary_reachable_cb(const GIsiMessage *msg, void *data)
 {
        struct ofono_devinfo *info = data;
+       struct devinfo_data *dev = ofono_devinfo_get_data(info);
 
        if (g_isi_msg_error(msg) < 0)
                return;
 
        ISI_VERSION_DBG(msg);
 
+       if (dev == NULL || dev->client != NULL)
+               return;
+
+       dev->client = dev->secondary;
+
        ofono_devinfo_register(info);
+       g_isi_client_destroy(dev->primary);
+
 }
 
 static int isi_devinfo_probe(struct ofono_devinfo *info, unsigned int vendor,
@@ -222,19 +314,30 @@ static int isi_devinfo_probe(struct ofono_devinfo *info, 
unsigned int vendor,
        if (data == NULL)
                return -ENOMEM;
 
-       data->client = g_isi_client_create(idx, PN_PHONE_INFO);
-       if (data->client == NULL) {
-               g_free(data);
-               return -ENOMEM;
-       }
+       data->primary = g_isi_client_create(idx, PN_MODEM_INFO);
+       if (data->primary == NULL)
+               goto nomem;
 
+       data->secondary = g_isi_client_create(idx, PN_PHONE_INFO);
+       if (data->secondary == NULL)
+               goto nomem;
 
        ofono_devinfo_set_data(info, data);
 
        g_isi_client_set_timeout(data->client, INFO_TIMEOUT);
-       g_isi_client_verify(data->client, reachable_cb, info, NULL);
+       g_isi_client_verify(data->primary, primary_reachable_cb, info, NULL);
+       g_isi_client_verify(data->secondary, secondary_reachable_cb, info,
+                               NULL);
 
        return 0;
+
+nomem:
+       g_isi_client_destroy(data->primary);
+       g_isi_client_destroy(data->secondary);
+
+       g_free(data);
+       return -ENOMEM;
+
 }
 
 static void isi_devinfo_remove(struct ofono_devinfo *info)
diff --git a/drivers/isimodem/info.h b/drivers/isimodem/info.h
index bdf1596..60425bf 100644
--- a/drivers/isimodem/info.h
+++ b/drivers/isimodem/info.h
@@ -27,6 +27,8 @@ extern "C" {
 #endif
 
 #define PN_PHONE_INFO                          0x1B
+#define PN_MODEM_INFO                          0xC5
+
 #define PN_EPOC_INFO                           98
 #define INFO_TIMEOUT                           5
 
@@ -50,6 +52,7 @@ enum info_message_id {
 };
 
 enum info_subblock {
+       INFO_SB_MODEMSW_VERSION =               0x00,
        INFO_SB_PRODUCT_INFO_NAME =             0x01,
        INFO_SB_PRODUCT_INFO_MANUFACTURER =     0x07,
        INFO_SB_SN_IMEI_PLAIN =                 0x41,
-- 
1.7.3.5

_______________________________________________
ofono mailing list
ofono@ofono.org
http://lists.ofono.org/listinfo/ofono

Reply via email to