mirror of git://git.sysmocom.de/ofono
Refactor sub-sub-block handling
This commit is contained in:
parent
a1ca46253f
commit
74cc9cb4b7
|
@ -77,6 +77,57 @@ static int forw_type_to_isi_code(int type)
|
||||||
return ss_code;
|
return ss_code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool decode_gsm_forwarding_info(const void *restrict data, size_t len,
|
||||||
|
uint8_t *status, uint8_t *ton,
|
||||||
|
uint8_t *norply, char **number)
|
||||||
|
{
|
||||||
|
GIsiSubBlockIter iter;
|
||||||
|
|
||||||
|
for (g_isi_sb_iter_init(&iter, data, len, 0);
|
||||||
|
g_isi_sb_iter_is_valid(&iter);
|
||||||
|
g_isi_sb_iter_next(&iter)) {
|
||||||
|
|
||||||
|
switch (g_isi_sb_iter_get_id(&iter)) {
|
||||||
|
|
||||||
|
case SS_GSM_FORWARDING_FEATURE: {
|
||||||
|
|
||||||
|
uint8_t _numlen;
|
||||||
|
uint8_t _status;
|
||||||
|
uint8_t _norply;
|
||||||
|
uint8_t _ton;
|
||||||
|
char *_number = NULL;
|
||||||
|
|
||||||
|
if (!g_isi_sb_iter_get_byte(&iter, &_status, 3)
|
||||||
|
|| !g_isi_sb_iter_get_byte(&iter, &_ton, 4)
|
||||||
|
|| !g_isi_sb_iter_get_byte(&iter, &_norply, 5)
|
||||||
|
|| !g_isi_sb_iter_get_byte(&iter, &_numlen, 7)
|
||||||
|
|| !g_isi_sb_iter_get_alpha_tag(&iter, &_number,
|
||||||
|
_numlen * 2, 10))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (status)
|
||||||
|
*status = _status;
|
||||||
|
if (ton)
|
||||||
|
*ton = _ton;
|
||||||
|
if (norply)
|
||||||
|
*norply = _norply;
|
||||||
|
if (number)
|
||||||
|
*number = _number;
|
||||||
|
else
|
||||||
|
g_free(_number);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
DBG("Skipping sub-sub-block: 0x%04X (%zu bytes)",
|
||||||
|
g_isi_sb_iter_get_id(&iter),
|
||||||
|
g_isi_sb_iter_get_len(&iter));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static bool registration_resp_cb(GIsiClient *client, const void *restrict data,
|
static bool registration_resp_cb(GIsiClient *client, const void *restrict data,
|
||||||
size_t len, uint16_t object, void *opaque)
|
size_t len, uint16_t object, void *opaque)
|
||||||
{
|
{
|
||||||
|
@ -107,39 +158,22 @@ static bool registration_resp_cb(GIsiClient *client, const void *restrict data,
|
||||||
|
|
||||||
case SS_GSM_FORWARDING_INFO: {
|
case SS_GSM_FORWARDING_INFO: {
|
||||||
|
|
||||||
GIsiSubBlockIter iter_fw;
|
guint8 status;
|
||||||
|
void *info = NULL;
|
||||||
|
size_t infolen;
|
||||||
|
|
||||||
if (g_isi_sb_iter_get_len(&iter) < 4)
|
if (!g_isi_sb_iter_get_data(&iter, &info, 4))
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
for (g_isi_sb_iter_init(&iter_fw, iter.start,
|
infolen = g_isi_sb_iter_get_len(&iter) - 4;
|
||||||
g_isi_sb_iter_get_len(&iter), 4);
|
|
||||||
g_isi_sb_iter_is_valid(&iter_fw);
|
|
||||||
g_isi_sb_iter_next(&iter_fw)) {
|
|
||||||
|
|
||||||
switch (g_isi_sb_iter_get_id(&iter_fw)) {
|
if (!decode_gsm_forwarding_info(info, infolen, &status,
|
||||||
|
NULL, NULL, NULL))
|
||||||
|
goto error;
|
||||||
|
|
||||||
case SS_GSM_FORWARDING_FEATURE: {
|
if (!(status & (SS_GSM_ACTIVE | SS_GSM_REGISTERED)))
|
||||||
|
goto error;
|
||||||
|
|
||||||
guint8 status;
|
|
||||||
|
|
||||||
if (!g_isi_sb_iter_get_byte(&iter_fw,
|
|
||||||
&status, 3))
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (!(status & SS_GSM_ACTIVE)
|
|
||||||
|| !(status & SS_GSM_REGISTERED))
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
DBG("Skipping sub-sub-block: 0x%04X (%zu bytes)",
|
|
||||||
g_isi_sb_iter_get_id(&iter_fw),
|
|
||||||
g_isi_sb_iter_get_len(&iter_fw));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
@ -255,39 +289,22 @@ static bool erasure_resp_cb(GIsiClient *client, const void *restrict data,
|
||||||
|
|
||||||
case SS_GSM_FORWARDING_INFO: {
|
case SS_GSM_FORWARDING_INFO: {
|
||||||
|
|
||||||
GIsiSubBlockIter iter_fw;
|
guint8 status;
|
||||||
|
void *info = NULL;
|
||||||
|
size_t infolen;
|
||||||
|
|
||||||
if (g_isi_sb_iter_get_len(&iter) < 4)
|
if (!g_isi_sb_iter_get_data(&iter, &info, 4))
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
for (g_isi_sb_iter_init(&iter_fw, iter.start,
|
infolen = g_isi_sb_iter_get_len(&iter) - 4;
|
||||||
g_isi_sb_iter_get_len(&iter), 4);
|
|
||||||
g_isi_sb_iter_is_valid(&iter_fw);
|
|
||||||
g_isi_sb_iter_next(&iter_fw)) {
|
|
||||||
|
|
||||||
switch (g_isi_sb_iter_get_id(&iter_fw)) {
|
if (!decode_gsm_forwarding_info(info, infolen, &status,
|
||||||
|
NULL, NULL, NULL))
|
||||||
|
goto error;
|
||||||
|
|
||||||
case SS_GSM_FORWARDING_FEATURE: {
|
if (status & (SS_GSM_ACTIVE | SS_GSM_REGISTERED))
|
||||||
|
goto error;
|
||||||
|
|
||||||
guint8 status;
|
|
||||||
|
|
||||||
if (!g_isi_sb_iter_get_byte(&iter_fw,
|
|
||||||
&status, 3))
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if ((status & SS_GSM_ACTIVE)
|
|
||||||
|| (status & SS_GSM_REGISTERED))
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
DBG("Skipping sub-sub-block: 0x%04X (%zu bytes)",
|
|
||||||
g_isi_sb_iter_get_id(&iter_fw),
|
|
||||||
g_isi_sb_iter_get_len(&iter_fw));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
@ -387,67 +404,32 @@ static bool query_resp_cb(GIsiClient *client, const void *restrict data,
|
||||||
|
|
||||||
case SS_GSM_FORWARDING_INFO: {
|
case SS_GSM_FORWARDING_INFO: {
|
||||||
|
|
||||||
GIsiSubBlockIter iter_fw;
|
guint8 status;
|
||||||
|
void *info = NULL;
|
||||||
|
size_t infolen;
|
||||||
|
|
||||||
if (g_isi_sb_iter_get_len(&iter) < 4)
|
guint8 ton;
|
||||||
|
guint8 norply;
|
||||||
|
char *number = NULL;
|
||||||
|
|
||||||
|
if (!g_isi_sb_iter_get_data(&iter, &info, 4))
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
for (g_isi_sb_iter_init(&iter_fw, iter.start,
|
infolen = g_isi_sb_iter_get_len(&iter) - 4;
|
||||||
g_isi_sb_iter_get_len(&iter), 4);
|
|
||||||
g_isi_sb_iter_is_valid(&iter_fw);
|
|
||||||
g_isi_sb_iter_next(&iter_fw)) {
|
|
||||||
|
|
||||||
switch (g_isi_sb_iter_get_id(&iter_fw)) {
|
if (!decode_gsm_forwarding_info(info, infolen, &status,
|
||||||
|
&ton, &norply, &number))
|
||||||
|
goto error;
|
||||||
|
|
||||||
case SS_GSM_FORWARDING_FEATURE: {
|
list.status = status & (SS_GSM_ACTIVE | SS_GSM_REGISTERED
|
||||||
|
| SS_GSM_PROVISIONED);
|
||||||
|
list.time = norply;
|
||||||
|
list.phone_number.type = ton | 128;
|
||||||
|
strncpy(list.phone_number.number, number,
|
||||||
|
OFONO_MAX_PHONE_NUMBER_LENGTH);
|
||||||
|
list.phone_number.number[OFONO_MAX_PHONE_NUMBER_LENGTH] = '\0';
|
||||||
|
g_free(number);
|
||||||
|
|
||||||
guint8 status;
|
|
||||||
guint8 ton;
|
|
||||||
guint8 norply;
|
|
||||||
guint8 numlen;
|
|
||||||
char* number = NULL;
|
|
||||||
|
|
||||||
if (!g_isi_sb_iter_get_byte(&iter_fw,
|
|
||||||
&status, 3))
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (!g_isi_sb_iter_get_byte(&iter_fw,
|
|
||||||
&ton, 4))
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (!g_isi_sb_iter_get_byte(&iter_fw,
|
|
||||||
&norply, 5))
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (!g_isi_sb_iter_get_byte(&iter_fw,
|
|
||||||
&numlen, 7))
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (!g_isi_sb_iter_get_alpha_tag(&iter_fw,
|
|
||||||
&number, numlen * 2, 10))
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
list.status = status & (SS_GSM_ACTIVE
|
|
||||||
| SS_GSM_REGISTERED
|
|
||||||
| SS_GSM_PROVISIONED);
|
|
||||||
|
|
||||||
list.time = norply;
|
|
||||||
|
|
||||||
strncpy(list.phone_number.number, number,
|
|
||||||
OFONO_MAX_PHONE_NUMBER_LENGTH);
|
|
||||||
list.phone_number.number[OFONO_MAX_PHONE_NUMBER_LENGTH] = '\0';
|
|
||||||
g_free(number);
|
|
||||||
|
|
||||||
list.phone_number.type = ton | 128;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
DBG("Skipping sub-sub-block: 0x%04X (%zu bytes)",
|
|
||||||
g_isi_sb_iter_get_id(&iter_fw),
|
|
||||||
g_isi_sb_iter_get_len(&iter_fw));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Reference in New Issue