mirror of git://git.sysmocom.de/ofono
Refactor devinfo driver
This commit is contained in:
parent
0c7a15b2bd
commit
63c2dd93b0
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue