Open Source Telephony
 help / color / mirror / Atom feed
* [RFC PATCH 1/2] smsutil: add fuzzy address check for status report
@ 2010-09-21 17:12 Petteri Tikander
  2010-09-21 17:12 ` [RFC PATCH 2/2] unit: add fuzzy address check to test-sms Petteri Tikander
  2010-09-22 21:33 ` [RFC PATCH 1/2] smsutil: add fuzzy address check for status report Denis Kenzior
  0 siblings, 2 replies; 3+ messages in thread
From: Petteri Tikander @ 2010-09-21 17:12 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 4838 bytes --]

---
 src/smsutil.c |  103 ++++++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 87 insertions(+), 16 deletions(-)

diff --git a/src/smsutil.c b/src/smsutil.c
index cd0fef2..8b05c68 100644
--- a/src/smsutil.c
+++ b/src/smsutil.c
@@ -2858,35 +2858,104 @@ gboolean status_report_assembly_report(struct status_report_assembly *assembly,
 	unsigned int offset = status_report->status_report.mr / 32;
 	unsigned int bit = 1 << (status_report->status_report.mr % 32);
 	struct id_table_node *node = NULL;
-	const char *straddr;
+	const char *r_addr, *s_addr;
+	struct sms_address addr;
 	GHashTable *id_table;
 	gpointer key, value;
 	gboolean delivered;
-	GHashTableIter iter;
+	GHashTableIter iter_addr, iter;
 	gboolean pending;
 	int i;
 	unsigned char *msgid;
+	unsigned int len, r_len, s_len;
 
 	/* We ignore temporary or tempfinal status reports */
 	if (sr_st_to_delivered(status_report->status_report.st,
 				&delivered) == FALSE)
 		return FALSE;
 
-	straddr = sms_address_to_string(&status_report->status_report.raddr);
-	id_table = g_hash_table_lookup(assembly->assembly_table, straddr);
+	r_addr = sms_address_to_string(&status_report->status_report.raddr);
+	id_table = g_hash_table_lookup(assembly->assembly_table, r_addr);
 
-	/* key (receiver address) does not exist in assembly */
-	if (id_table == NULL)
-		return FALSE;
+	/* key (receiver address) exists in assembly */
+	if (id_table != NULL) {
 
-	g_hash_table_iter_init(&iter, id_table);
-	while (g_hash_table_iter_next(&iter, &key, &value)) {
-		node = value;
+		/* Found an identical address from assembly. */
+		s_addr = r_addr;
 
-		if (node->mrs[offset] & bit)
-			break;
+		g_hash_table_iter_init(&iter, id_table);
+		while (g_hash_table_iter_next(&iter, &key, &value)) {
+			node = value;
+
+			if (node->mrs[offset] & bit)
+				break;
 
-		node = NULL;
+			node = NULL;
+		}
+	}
+	/*
+	 * Key (receiver address) does not exist in assembly.
+	 * Some networks can change address to international format,
+	 * although address is sent in the national format.
+	 * Handle also change from national to international format.
+	 * So notify these special cases by comparing only
+	 * last six digits of the assembly addresses and received address.
+	 * If address contains less than six digits,
+	 * compare only existing digits.
+	 */
+	else {
+		g_hash_table_iter_init(&iter_addr, assembly->assembly_table);
+
+		/*
+		 * Go through all addresses using 'fuzzy' address-comparation.
+		 * Each address can relate to 1-n msg_ids.
+		 */
+		while (g_hash_table_iter_next(&iter_addr, (gpointer) &s_addr,
+						(gpointer) &id_table)) {
+
+			/* Notify international <-> national conversions */
+			if (((r_addr[0] == '+') && (s_addr[0] != '+')) ||
+				((r_addr[0] != '+') && (s_addr[0] == '+'))) {
+
+				r_len = strlen(r_addr);
+				s_len = strlen(s_addr);
+
+				len = MIN(6, MIN(r_len, s_len));
+
+				for (i = 0; i < len; i++) {
+					if (s_addr[s_len - i - 1] !=
+							r_addr[r_len - i - 1])
+						break;
+				}
+
+				/* Not all digits matched. */
+				if (i < len)
+					continue;
+			}
+			/* No conversions */
+			else
+				continue;
+
+			/* Address matched. Check message reference. */
+			g_hash_table_iter_init(&iter, id_table);
+			while (g_hash_table_iter_next(&iter, &key, &value)) {
+				node = value;
+
+				/* Address and MR matched */
+				if (node->mrs[offset] & bit)
+					break;
+
+				node = NULL;
+			}
+
+			/*
+			 * Received address with MR matched with one
+			 * of the stored addresses and MR, so no need
+			 * to continue searching.
+			 */
+			if (node)
+				break;
+		}
 	}
 
 	/* Unable to find a message reference belonging to this address */
@@ -2913,13 +2982,15 @@ gboolean status_report_assembly_report(struct status_report_assembly *assembly,
 
 	msgid = (unsigned char *) key;
 
+	sms_address_from_string(&addr, s_addr);
+
 	if (pending == TRUE && node->deliverable == TRUE) {
 		/*
 		 * More status reports expected, and already received
 		 * reports completed. Update backup file.
 		 */
 		sr_assembly_add_fragment_backup(assembly->imsi, node,
-					&status_report->status_report.raddr,
+					&addr,
 					msgid);
 
 		return FALSE;
@@ -2932,14 +3003,14 @@ gboolean status_report_assembly_report(struct status_report_assembly *assembly,
 		memcpy(out_msgid, msgid, SMS_MSGID_LEN);
 
 	sr_assembly_remove_fragment_backup(assembly->imsi,
-					&status_report->status_report.raddr,
+					&addr,
 					msgid);
 
 	g_hash_table_iter_remove(&iter);
 
 	if (g_hash_table_size(id_table) == 0)
 		g_hash_table_remove(assembly->assembly_table,
-				status_report->status_report.raddr.address);
+					s_addr);
 
 	return TRUE;
 }
-- 
1.6.3.3



^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [RFC PATCH 2/2] unit: add fuzzy address check to test-sms
  2010-09-21 17:12 [RFC PATCH 1/2] smsutil: add fuzzy address check for status report Petteri Tikander
@ 2010-09-21 17:12 ` Petteri Tikander
  2010-09-22 21:33 ` [RFC PATCH 1/2] smsutil: add fuzzy address check for status report Denis Kenzior
  1 sibling, 0 replies; 3+ messages in thread
From: Petteri Tikander @ 2010-09-21 17:12 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 3069 bytes --]

---
 unit/test-sms.c |   43 ++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 42 insertions(+), 1 deletions(-)

diff --git a/unit/test-sms.c b/unit/test-sms.c
index d7a1b4d..f0089e0 100644
--- a/unit/test-sms.c
+++ b/unit/test-sms.c
@@ -1273,8 +1273,11 @@ static void test_sr_assembly()
 				"940A00";
 	const char *sr_pdu2 = "06050D91945152991136F00160124130640A0160124130"
 				"450A00";
+	const char *sr_pdu3 = "0606098121436587F9019012413064A0019012413045A0"
+				"00";
         struct sms sr1;
 	struct sms sr2;
+	struct sms sr3;
 	unsigned char pdu[176];
 	long pdu_len;
 	struct status_report_assembly *sra;
@@ -1285,7 +1288,7 @@ static void test_sr_assembly()
 						16, 17, 18, 19 };
 	unsigned char id[SMS_MSGID_LEN];
 
-	/* mr 4 & mr 5 */
+	/* international address, mr 4 & mr 5 */
 
         decode_hex_own_buf(sr_pdu1, -1, &pdu_len, 0, pdu);
 	g_assert(sms_decode(pdu, pdu_len, FALSE, 26, &sr1) == TRUE);
@@ -1293,6 +1296,11 @@ static void test_sr_assembly()
 	decode_hex_own_buf(sr_pdu2, -1, &pdu_len, 0, pdu);
 	g_assert(sms_decode(pdu, pdu_len, FALSE, 26, &sr2) == TRUE);
 
+	/* national address, mr 6 */
+
+	decode_hex_own_buf(sr_pdu3, -1, &pdu_len, 0, pdu);
+	g_assert(sms_decode(pdu, pdu_len, FALSE, 24, &sr3) == TRUE);
+
 	g_print("sr1 address: %s, mr: %d\n",
 			sms_address_to_string(&sr1.status_report.raddr),
 			sr1.status_report.mr);
@@ -1301,6 +1309,10 @@ static void test_sr_assembly()
 			sms_address_to_string(&sr2.status_report.raddr),
 			sr2.status_report.mr);
 
+	g_print("sr3 address: %s, mr: %d\n",
+			sms_address_to_string(&sr3.status_report.raddr),
+			sr3.status_report.mr);
+
 	sms_address_from_string(&addr, "+4915259911630");
 
 	sra = status_report_assembly_new(NULL);
@@ -1319,6 +1331,35 @@ static void test_sr_assembly()
 
 	g_assert(memcmp(id, sha1, SMS_MSGID_LEN) == 0);
 	g_assert(delivered == TRUE);
+
+	/*
+	 * Send sms-message in the national address-format,
+	 * but receive in the international address-format.
+	 */
+	sms_address_from_string(&addr, "9911630");
+	status_report_assembly_add_fragment(sra, sha1, &addr, 4, time(NULL), 2);
+	status_report_assembly_add_fragment(sra, sha1, &addr, 5, time(NULL), 2);
+
+	g_assert(!status_report_assembly_report(sra, &sr1, id, &delivered));
+	g_assert(status_report_assembly_report(sra, &sr2, id, &delivered));
+
+	g_assert(memcmp(id, sha1, SMS_MSGID_LEN) == 0);
+	g_assert(delivered == TRUE);
+	g_assert(g_hash_table_size(sra->assembly_table) == 0);
+
+	/*
+	 * Send sms-message in the international address-format,
+	 * but receive in the national address-format.
+	 */
+	sms_address_from_string(&addr, "+358123456789");
+	status_report_assembly_add_fragment(sra, sha1, &addr, 6, time(NULL), 1);
+
+	g_assert(status_report_assembly_report(sra, &sr3, id, &delivered));
+
+	g_assert(memcmp(id, sha1, SMS_MSGID_LEN) == 0);
+	g_assert(delivered == TRUE);
+	g_assert(g_hash_table_size(sra->assembly_table) == 0);
+
 	status_report_assembly_free(sra);
 }
 
-- 
1.6.3.3



^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [RFC PATCH 1/2] smsutil: add fuzzy address check for status report
  2010-09-21 17:12 [RFC PATCH 1/2] smsutil: add fuzzy address check for status report Petteri Tikander
  2010-09-21 17:12 ` [RFC PATCH 2/2] unit: add fuzzy address check to test-sms Petteri Tikander
@ 2010-09-22 21:33 ` Denis Kenzior
  1 sibling, 0 replies; 3+ messages in thread
From: Denis Kenzior @ 2010-09-22 21:33 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 386 bytes --]

On 09/21/2010 12:12 PM, Petteri Tikander wrote:
> ---
>  src/smsutil.c |  103 ++++++++++++++++++++++++++++++++++++++++++++++++---------
>  1 files changed, 87 insertions(+), 16 deletions(-)

Both patches have been applied, thanks!  I reflowed the first patch a
bit just to make it a little easier to follow.

I've also marked the status report task as done.

Thanks,
-Denis

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2010-09-22 21:33 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-09-21 17:12 [RFC PATCH 1/2] smsutil: add fuzzy address check for status report Petteri Tikander
2010-09-21 17:12 ` [RFC PATCH 2/2] unit: add fuzzy address check to test-sms Petteri Tikander
2010-09-22 21:33 ` [RFC PATCH 1/2] smsutil: add fuzzy address check for status report Denis Kenzior

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox