Refactor devinfo driver

This commit is contained in:
Aki Niemi 2010-01-08 10:59:17 +02:00
parent 0c7a15b2bd
commit 63c2dd93b0
1 changed files with 47 additions and 56 deletions

View File

@ -64,25 +64,24 @@ static bool info_resp_cb(GIsiClient *client, const void *restrict data,
} }
if (len < 3) { if (len < 3) {
DBG("Truncated message."); DBG("truncated message");
goto error; return false;
} }
if (msg[0] != INFO_PRODUCT_INFO_READ_RESP && if (msg[0] != INFO_PRODUCT_INFO_READ_RESP
msg[0] != INFO_VERSION_READ_RESP && && msg[0] != INFO_VERSION_READ_RESP
msg[0] != INFO_SERIAL_NUMBER_READ_RESP) { && msg[0] != INFO_SERIAL_NUMBER_READ_RESP)
DBG("Unexpected message ID: 0x%02x", msg[0]); return false;
goto error;
}
if (msg[1] != INFO_OK) { if (msg[1] != INFO_OK) {
DBG("Request failed: 0x%02X", msg[1]); DBG("request failed: %s", info_isi_cause_name(msg[1]));
goto error; goto error;
} }
for (g_isi_sb_iter_init(&iter, msg, len, 3); for (g_isi_sb_iter_init(&iter, msg, len, 3);
g_isi_sb_iter_is_valid(&iter); g_isi_sb_iter_is_valid(&iter);
g_isi_sb_iter_next(&iter)) { g_isi_sb_iter_next(&iter)) {
switch (g_isi_sb_iter_get_id(&iter)) { switch (g_isi_sb_iter_get_id(&iter)) {
case INFO_SB_PRODUCT_INFO_MANUFACTURER: 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_MCUSW_VERSION:
case INFO_SB_SN_IMEI_PLAIN: case INFO_SB_SN_IMEI_PLAIN:
if (g_isi_sb_iter_get_len(&iter) < 5) 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; goto error;
if (!g_isi_sb_iter_get_byte(&iter, &chars, 3))
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); CALLBACK_WITH_SUCCESS(cb, info, cbd->data);
g_free(info); g_free(info);
goto out;
g_free(cbd);
return true;
default: default:
DBG("Unknown sub-block: 0x%02X (%zu bytes)", DBG("skipping: %s (%zu bytes)",
g_isi_sb_iter_get_id(&iter), info_subblock_name(g_isi_sb_iter_get_id(&iter)),
g_isi_sb_iter_get_len(&iter)); g_isi_sb_iter_get_len(&iter));
break; break;
} }
@ -115,8 +111,6 @@ static bool info_resp_cb(GIsiClient *client, const void *restrict data,
error: error:
CALLBACK_WITH_FAILURE(cb, "", cbd->data); CALLBACK_WITH_FAILURE(cb, "", cbd->data);
out:
g_free(cbd); g_free(cbd);
return true; return true;
} }
@ -136,15 +130,13 @@ static void isi_query_manufacturer(struct ofono_devinfo *info,
if (!cbd) if (!cbd)
goto error; goto error;
if (g_isi_request_make(dev->client, msg, sizeof(msg), INFO_TIMEOUT, if (g_isi_request_make(dev->client, msg, sizeof(msg),
info_resp_cb, cbd)) INFO_TIMEOUT, info_resp_cb, cbd))
return; return;
error: error:
if (cbd)
g_free(cbd);
CALLBACK_WITH_FAILURE(cb, "", data); CALLBACK_WITH_FAILURE(cb, "", data);
g_free(cbd);
} }
static void isi_query_model(struct ofono_devinfo *info, static void isi_query_model(struct ofono_devinfo *info,
@ -162,15 +154,13 @@ static void isi_query_model(struct ofono_devinfo *info,
if (!cbd) if (!cbd)
goto error; goto error;
if (g_isi_request_make(dev->client, msg, sizeof(msg), INFO_TIMEOUT, if (g_isi_request_make(dev->client, msg, sizeof(msg),
info_resp_cb, cbd)) INFO_TIMEOUT, info_resp_cb, cbd))
return; return;
error: error:
if (cbd)
g_free(cbd);
CALLBACK_WITH_FAILURE(cb, "", data); CALLBACK_WITH_FAILURE(cb, "", data);
g_free(cbd);
} }
static void isi_query_revision(struct ofono_devinfo *info, static void isi_query_revision(struct ofono_devinfo *info,
@ -189,15 +179,13 @@ static void isi_query_revision(struct ofono_devinfo *info,
if (!cbd) if (!cbd)
goto error; goto error;
if (g_isi_request_make(dev->client, msg, sizeof(msg), INFO_TIMEOUT, if (g_isi_request_make(dev->client, msg, sizeof(msg),
info_resp_cb, cbd)) INFO_TIMEOUT, info_resp_cb, cbd))
return; return;
error: error:
if (cbd)
g_free(cbd);
CALLBACK_WITH_FAILURE(cb, "", data); CALLBACK_WITH_FAILURE(cb, "", data);
g_free(cbd);
} }
static void isi_query_serial(struct ofono_devinfo *info, static void isi_query_serial(struct ofono_devinfo *info,
@ -215,20 +203,24 @@ static void isi_query_serial(struct ofono_devinfo *info,
if (!cbd) if (!cbd)
goto error; goto error;
if (g_isi_request_make(dev->client, msg, sizeof(msg), INFO_TIMEOUT, if (g_isi_request_make(dev->client, msg, sizeof(msg),
info_resp_cb, cbd)) INFO_TIMEOUT, info_resp_cb, cbd))
return; return;
error: error:
if (cbd)
g_free(cbd);
CALLBACK_WITH_FAILURE(cb, "", data); CALLBACK_WITH_FAILURE(cb, "", data);
g_free(cbd);
} }
static gboolean isi_devinfo_register(gpointer user) static gboolean isi_devinfo_register(gpointer user)
{ {
struct ofono_devinfo *info = 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); ofono_devinfo_register(info);
@ -240,15 +232,17 @@ static void reachable_cb(GIsiClient *client, bool alive, uint16_t object,
{ {
struct ofono_devinfo *info = opaque; struct ofono_devinfo *info = opaque;
if (alive == true) { if (!alive) {
DBG("Resource 0x%02X, with version %03d.%03d reachable", DBG("devinfo driver bootstrap failed");
g_isi_client_resource(client),
g_isi_version_major(client),
g_isi_version_minor(client));
g_idle_add(isi_devinfo_register, info);
return; 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, 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) if (!data)
return -ENOMEM; return -ENOMEM;
DBG("idx=%p", idx);
data->client = g_isi_client_create(idx, PN_PHONE_INFO); data->client = g_isi_client_create(idx, PN_PHONE_INFO);
if (!data->client) { if (!data->client) {
g_free(data); 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); ofono_devinfo_set_data(info, data);
if (!g_isi_verify(data->client, reachable_cb, info)) g_isi_verify(data->client, reachable_cb, info);
DBG("Unable to verify reachability");
return 0; return 0;
} }