static void u8500_info_resp_cb(const GIsiMessage *msg, void *data) { struct isi_cb_data *cbd = data; ofono_devinfo_query_cb_t cb = cbd->cb; GIsiSubBlockIter iter; uint8_t msgid; uint8_t status; msgid = g_isi_msg_id(msg); if (msgid != INFO_SERIAL_NUMBER_READ_RESP) goto error; if (g_isi_msg_error(msg) < 0) goto error; if (!g_isi_msg_data_get_byte(msg, 0, &status)) goto error; if (status != INFO_OK) goto error; for (g_isi_sb_iter_init(&iter, msg, 2); g_isi_sb_iter_is_valid(&iter); g_isi_sb_iter_next(&iter)) { uint8_t id = g_isi_sb_iter_get_id(&iter); uint8_t chars; char *info = NULL; 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_MODEMSW_VERSION) continue; if (g_isi_sb_iter_get_len(&iter) < 5) 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; CALLBACK_WITH_SUCCESS(cb, info, cbd->data); g_free(info); return; } error: CALLBACK_WITH_FAILURE(cb, "", cbd->data); }
static gboolean parse_sms_address(GIsiSubBlockIter *iter, unsigned offset, struct sms_addr *add) { add->data = NULL; if (!g_isi_sb_iter_get_byte(iter, &add->type, offset)) return FALSE; if (!g_isi_sb_iter_get_byte(iter, &add->len, offset + 1)) return FALSE; if (add->len == 0) return FALSE; if (!g_isi_sb_iter_get_struct(iter, (void **) &add->data, add->len, offset + 2)) return FALSE; return TRUE; }
static gboolean parse_sms_tpdu(GIsiSubBlockIter *iter, unsigned offset, struct sms_common *com) { com->data = NULL; if (!g_isi_sb_iter_get_byte(iter, &com->len, offset)) return FALSE; if (com->len == 0) return FALSE; if (!g_isi_sb_iter_get_struct(iter, (void **) &com->data, com->len, offset + 2)) return FALSE; return TRUE; }
static int decode_read_response(const unsigned char *msg, size_t len, struct ofono_phonebook *pb) { GIsiSubBlockIter iter; char *name = NULL; char *number = NULL; char *sne = NULL; char *anr = NULL; char *email = NULL; int location = -1; guint8 status = 0; if (len < 3 || msg[0] != SIM_PB_RESP_SIM_PB_READ) goto error; if (msg[1] != SIM_PB_READ) goto error; for (g_isi_sb_iter_init_full(&iter, msg, len, 3, TRUE, msg[2]); g_isi_sb_iter_is_valid(&iter); g_isi_sb_iter_next(&iter)) { switch (g_isi_sb_iter_get_id(&iter)) { case SIM_PB_ADN: { guint16 loc; guint8 namelen; guint8 numberlen; if (!g_isi_sb_iter_get_word(&iter, &loc, 4) || !g_isi_sb_iter_get_byte(&iter, &namelen, 6) || !g_isi_sb_iter_get_byte(&iter, &numberlen, 7)) goto error; if (!g_isi_sb_iter_get_alpha_tag(&iter, &name, namelen * 2, 8)) goto error; if (!g_isi_sb_iter_get_alpha_tag(&iter, &number, numberlen * 2, 8 + namelen * 2)) goto error; location = loc; break; } case SIM_PB_SNE: { guint8 snelen; if (!g_isi_sb_iter_get_byte(&iter, &snelen, 6)) goto error; if (!g_isi_sb_iter_get_alpha_tag(&iter, &sne, snelen * 2, 8)) goto error; break; } case SIM_PB_ANR: { guint8 anrlen; if (!g_isi_sb_iter_get_byte(&iter, &anrlen, 6)) goto error; if (!g_isi_sb_iter_get_alpha_tag(&iter, &anr, anrlen * 2, 8)) goto error; break; } case SIM_PB_EMAIL: { guint8 emaillen; if (!g_isi_sb_iter_get_byte(&iter, &emaillen, 6)) goto error; if (!g_isi_sb_iter_get_alpha_tag(&iter, &email, emaillen * 2, 8)) goto error; break; } case SIM_PB_STATUS: if (!g_isi_sb_iter_get_byte(&iter, &status, 4)) goto error; break; default: DBG("Skipping sub-block: %s (%zd bytes)", sim_subblock_name(g_isi_sb_iter_get_id(&iter)), g_isi_sb_iter_get_len(&iter)); break; } } if (status != SIM_SERV_OK) { DBG("Request failed: %s (0x%02X)", sim_isi_cause_name(status), status); goto error; } ofono_phonebook_entry(pb, -1, number, -1, name, -1, NULL, anr, -1, sne, email, NULL, NULL); error: g_free(name); g_free(number); g_free(sne); g_free(anr); g_free(email); return location; }