[PATCH 1/4] Enhance topic range list utilities

Andrzej Zaborowski andrew.zaborowski at intel.com
Tue Dec 15 18:05:50 PST 2009


The functions need to handle full 16-bit range to be useful for EFcbmid
handling.
---
 src/smsutil.c |   28 ++++++++++++++++++++++++----
 src/smsutil.h |    2 ++
 2 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/src/smsutil.c b/src/smsutil.c
index c27e937..d5169f0 100644
--- a/src/smsutil.c
+++ b/src/smsutil.c
@@ -3509,12 +3509,12 @@ out:
 	return TRUE;
 }
 
-static GSList *cbs_optimize_ranges(GSList *ranges)
+GSList *cbs_optimize_ranges(GSList *ranges)
 {
 	struct cbs_topic_range *range;
-	unsigned char bitmap[125];
+	unsigned char bitmap[8192];
 	GSList *l;
-	unsigned short i;
+	unsigned int i;
 	GSList *ret = NULL;
 
 	memset(bitmap, 0, sizeof(bitmap));
@@ -3532,7 +3532,7 @@ static GSList *cbs_optimize_ranges(GSList *ranges)
 
 	range = NULL;
 
-	for (i = 0; i <= 999; i++) {
+	for (i = 0; i <= 65535; i++) {
 		int byte_offset = i / 8;
 		int bit = i % 8;
 
@@ -3666,3 +3666,23 @@ char *cbs_topic_ranges_to_string(GSList *ranges)
 
 	return ret;
 }
+
+static gint cbs_topic_compare(gconstpointer a, gconstpointer b)
+{
+	const struct cbs_topic_range *range = a;
+	unsigned short topic = GPOINTER_TO_UINT(b);
+
+	if (topic >= range->min && topic <= range->max)
+		return 0;
+
+	return 1;
+}
+
+gboolean cbs_topic_in_range(unsigned int topic, GSList *ranges)
+{
+	if (!ranges)
+		return FALSE;
+
+	return g_slist_find_custom(ranges, GUINT_TO_POINTER(topic),
+					cbs_topic_compare) != NULL;
+}
diff --git a/src/smsutil.h b/src/smsutil.h
index 858fc84..10774dc 100644
--- a/src/smsutil.h
+++ b/src/smsutil.h
@@ -494,3 +494,5 @@ void cbs_assembly_location_changed(struct cbs_assembly *assembly, gboolean plmn,
 
 char *cbs_topic_ranges_to_string(GSList *ranges);
 GSList *cbs_extract_topic_ranges(const char *ranges);
+GSList *cbs_optimize_ranges(GSList *ranges);
+gboolean cbs_topic_in_range(unsigned int topic, GSList *ranges);
-- 
1.6.1



More information about the ofono mailing list