diff options
author | Aki Niemi <aki.niemi@nokia.com> | 2010-01-08 10:59:17 +0200 |
---|---|---|
committer | Aki Niemi <aki.niemi@nokia.com> | 2010-01-11 10:52:07 +0200 |
commit | 63c2dd93b0700b80fa1b46662e8a06d7a776cde7 (patch) | |
tree | 181381171b30b80d73a3cc92cd2ece78c352497f /drivers/isimodem/devinfo.c | |
parent | 0c7a15b2bd26284c76828a7e8715351cf31d0762 (diff) | |
download | ofono-63c2dd93b0700b80fa1b46662e8a06d7a776cde7.tar.bz2 |
Refactor devinfo driver
Diffstat (limited to 'drivers/isimodem/devinfo.c')
-rw-r--r-- | drivers/isimodem/devinfo.c | 103 |
1 files changed, 47 insertions, 56 deletions
diff --git a/drivers/isimodem/devinfo.c b/drivers/isimodem/devinfo.c index 41b2870f..03ece9fd 100644 --- a/drivers/isimodem/devinfo.c +++ b/drivers/isimodem/devinfo.c @@ -64,25 +64,24 @@ static bool info_resp_cb(GIsiClient *client, const void *restrict data, } if (len < 3) { - DBG("Truncated message."); - goto error; + DBG("truncated message"); + return false; } - if (msg[0] != INFO_PRODUCT_INFO_READ_RESP && - msg[0] != INFO_VERSION_READ_RESP && - msg[0] != INFO_SERIAL_NUMBER_READ_RESP) { - DBG("Unexpected message ID: 0x%02x", msg[0]); - goto error; - } + if (msg[0] != INFO_PRODUCT_INFO_READ_RESP + && msg[0] != INFO_VERSION_READ_RESP + && msg[0] != INFO_SERIAL_NUMBER_READ_RESP) + return false; if (msg[1] != INFO_OK) { - DBG("Request failed: 0x%02X", msg[1]); + DBG("request failed: %s", info_isi_cause_name(msg[1])); goto error; } for (g_isi_sb_iter_init(&iter, msg, len, 3); - g_isi_sb_iter_is_valid(&iter); - g_isi_sb_iter_next(&iter)) { + g_isi_sb_iter_is_valid(&iter); + g_isi_sb_iter_next(&iter)) { + switch (g_isi_sb_iter_get_id(&iter)) { case INFO_SB_PRODUCT_INFO_MANUFACTURER: @@ -90,24 +89,21 @@ static bool info_resp_cb(GIsiClient *client, const void *restrict data, case INFO_SB_MCUSW_VERSION: case INFO_SB_SN_IMEI_PLAIN: - if (g_isi_sb_iter_get_len(&iter) < 5) - goto error; - - if (!g_isi_sb_iter_get_byte(&iter, &chars, 3)) + if (g_isi_sb_iter_get_len(&iter) < 5 + || !g_isi_sb_iter_get_byte(&iter, &chars, 3) + || !g_isi_sb_iter_get_latin_tag(&iter, + &info, chars, 4)) goto error; - if (!g_isi_sb_iter_get_latin_tag(&iter, - &info, chars, 4)) - goto error; - - DBG("info=<%s>", info); CALLBACK_WITH_SUCCESS(cb, info, cbd->data); g_free(info); - goto out; + + g_free(cbd); + return true; default: - DBG("Unknown sub-block: 0x%02X (%zu bytes)", - g_isi_sb_iter_get_id(&iter), + DBG("skipping: %s (%zu bytes)", + info_subblock_name(g_isi_sb_iter_get_id(&iter)), g_isi_sb_iter_get_len(&iter)); break; } @@ -115,8 +111,6 @@ static bool info_resp_cb(GIsiClient *client, const void *restrict data, error: CALLBACK_WITH_FAILURE(cb, "", cbd->data); - -out: g_free(cbd); return true; } @@ -136,15 +130,13 @@ static void isi_query_manufacturer(struct ofono_devinfo *info, if (!cbd) goto error; - if (g_isi_request_make(dev->client, msg, sizeof(msg), INFO_TIMEOUT, - info_resp_cb, cbd)) + if (g_isi_request_make(dev->client, msg, sizeof(msg), + INFO_TIMEOUT, info_resp_cb, cbd)) return; error: - if (cbd) - g_free(cbd); - CALLBACK_WITH_FAILURE(cb, "", data); + g_free(cbd); } static void isi_query_model(struct ofono_devinfo *info, @@ -162,15 +154,13 @@ static void isi_query_model(struct ofono_devinfo *info, if (!cbd) goto error; - if (g_isi_request_make(dev->client, msg, sizeof(msg), INFO_TIMEOUT, - info_resp_cb, cbd)) + if (g_isi_request_make(dev->client, msg, sizeof(msg), + INFO_TIMEOUT, info_resp_cb, cbd)) return; error: - if (cbd) - g_free(cbd); - CALLBACK_WITH_FAILURE(cb, "", data); + g_free(cbd); } static void isi_query_revision(struct ofono_devinfo *info, @@ -189,15 +179,13 @@ static void isi_query_revision(struct ofono_devinfo *info, if (!cbd) goto error; - if (g_isi_request_make(dev->client, msg, sizeof(msg), INFO_TIMEOUT, - info_resp_cb, cbd)) + if (g_isi_request_make(dev->client, msg, sizeof(msg), + INFO_TIMEOUT, info_resp_cb, cbd)) return; error: - if (cbd) - g_free(cbd); - CALLBACK_WITH_FAILURE(cb, "", data); + g_free(cbd); } static void isi_query_serial(struct ofono_devinfo *info, @@ -215,20 +203,24 @@ static void isi_query_serial(struct ofono_devinfo *info, if (!cbd) goto error; - if (g_isi_request_make(dev->client, msg, sizeof(msg), INFO_TIMEOUT, - info_resp_cb, cbd)) + if (g_isi_request_make(dev->client, msg, sizeof(msg), + INFO_TIMEOUT, info_resp_cb, cbd)) return; error: - if (cbd) - g_free(cbd); - CALLBACK_WITH_FAILURE(cb, "", data); + g_free(cbd); } static gboolean isi_devinfo_register(gpointer user) { struct ofono_devinfo *info = user; + struct devinfo_data *dd = ofono_devinfo_get_data(info); + + const char *debug = getenv("OFONO_ISI_DEBUG"); + + if (debug && (strcmp(debug, "all") == 0 || strcmp(debug, "info") == 0)) + g_isi_client_set_debug(dd->client, info_debug, NULL); ofono_devinfo_register(info); @@ -240,15 +232,17 @@ static void reachable_cb(GIsiClient *client, bool alive, uint16_t object, { struct ofono_devinfo *info = opaque; - if (alive == true) { - DBG("Resource 0x%02X, with version %03d.%03d reachable", - g_isi_client_resource(client), - g_isi_version_major(client), - g_isi_version_minor(client)); - g_idle_add(isi_devinfo_register, info); + if (!alive) { + DBG("devinfo driver bootstrap failed"); return; } - DBG("Unable to bootsrap devinfo driver"); + + DBG("%s (v%03d.%03d) reachable", + pn_resource_name(g_isi_client_resource(client)), + g_isi_version_major(client), + g_isi_version_minor(client)); + + g_idle_add(isi_devinfo_register, info); } static int isi_devinfo_probe(struct ofono_devinfo *info, unsigned int vendor, @@ -260,8 +254,6 @@ static int isi_devinfo_probe(struct ofono_devinfo *info, unsigned int vendor, if (!data) return -ENOMEM; - DBG("idx=%p", idx); - data->client = g_isi_client_create(idx, PN_PHONE_INFO); if (!data->client) { g_free(data); @@ -270,8 +262,7 @@ static int isi_devinfo_probe(struct ofono_devinfo *info, unsigned int vendor, ofono_devinfo_set_data(info, data); - if (!g_isi_verify(data->client, reachable_cb, info)) - DBG("Unable to verify reachability"); + g_isi_verify(data->client, reachable_cb, info); return 0; } |