From dc505be37322517c97a119ffb520d710d54521c1 Mon Sep 17 00:00:00 2001 From: Denis Kenzior Date: Wed, 16 Jun 2010 17:23:44 -0500 Subject: [PATCH] stkutil: Merge two versions of bcch_channel_list --- src/stkutil.c | 14 ++++++++------ src/stkutil.h | 8 +++----- unit/test-stkutil.c | 5 +++-- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/stkutil.c b/src/stkutil.c index 065d3033..79f8d92d 100644 --- a/src/stkutil.c +++ b/src/stkutil.c @@ -852,10 +852,12 @@ static gboolean parse_dataobj_bcch_channel_list( unsigned int index = i * 10 / 8; unsigned int occupied = i * 10 % 8; - bcl->channel[i] = (data[index] << (2 + occupied)) + + bcl->channels[i] = (data[index] << (2 + occupied)) + (data[index + 1] >> (6 - occupied)); } + bcl->has_list = TRUE; + return TRUE; } @@ -4446,27 +4448,27 @@ static gboolean build_dataobj_transaction_id(struct stk_tlv_builder *tlv, static gboolean build_dataobj_bcch_channel_list(struct stk_tlv_builder *tlv, const void *data, gboolean cr) { - const struct stk_bcch_ch_list *list = data; + const struct stk_bcch_channel_list *list = data; unsigned char tag = STK_DATA_OBJECT_TYPE_BCCH_CHANNEL_LIST; - int i, bytes, pos, shift; + unsigned int i, bytes, pos, shift; unsigned char value; /* To distinguish between no BCCH Channel List data object and * an empty object in a sequence of empty and non-empty objects, * .channels must be non-NULL in objects in sequences. */ - if (list->channels == NULL) + if (list->has_list == FALSE) return TRUE; if (stk_tlv_builder_open_container(tlv, cr, tag, TRUE) != TRUE) return FALSE; - bytes = (list->length * 10 + 7) / 8; + bytes = (list->num * 10 + 7) / 8; for (i = 0; i < bytes; i++) { pos = (i * 8 + 7) / 10; shift = pos * 10 + 10 - i * 8 - 8; value = 0; - if (pos < list->length) + if (pos < list->num) value |= list->channels[pos] >> shift; if (shift > 2) value |= list->channels[pos - 1] << (10 - shift); diff --git a/src/stkutil.h b/src/stkutil.h index 000f45df..471e10f2 100644 --- a/src/stkutil.h +++ b/src/stkutil.h @@ -716,8 +716,9 @@ struct stk_transaction_id { * is represented as 10 bits, so the maximum number of channel is 127*8/10=101. */ struct stk_bcch_channel_list { - unsigned short channel[101]; + unsigned short channels[101]; unsigned int num; + ofono_bool_t has_list; }; /* @@ -1365,10 +1366,7 @@ struct stk_response_local_info { const char *imei; struct stk_network_measurement_results { struct stk_common_byte_array nmr; - struct stk_bcch_ch_list { - const short *channels; - int length; - } bcch_ch_list; + struct stk_bcch_channel_list bcch_ch_list; } nmr; struct sms_scts datetime; const char *language; diff --git a/unit/test-stkutil.c b/unit/test-stkutil.c index b23a1b5f..706dd85d 100644 --- a/unit/test-stkutil.c +++ b/unit/test-stkutil.c @@ -17370,11 +17370,12 @@ static const struct terminal_response_test .len = 16, }, .bcch_ch_list = { - .channels = (short[]) { + .channels = { 561, 565, 568, 569, 573, 575, 577, 581, 582, 585, }, - .length = 10, + .num = 10, + .has_list = TRUE, }, }}, }},