diff options
author | Kyle Evans <kvans32@gmail.com> | 2024-07-11 16:20:21 -0400 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2024-09-09 08:48:37 +0000 |
commit | ae88eeed4939d114e27581da03c48ac9acb08ee1 (patch) | |
tree | 3c8357bc6ff6caa11386936860a76ce1dd931fbe /src/mm-sms-list.c | |
parent | d763b9467764be438c5cfab3416ea5bf184da248 (diff) |
mm-base-sms: cmp by reference & number
Messages from different senders can have the same reference.
Stale messages from the same sender can also conflict.
Consider the number of the sender and also the max parts
when assigning parts to a base sms.
Ref 3gpp specification section 9.2.3.24.1
Fixes #757
Signed-off-by: Kyle Evans <kvans32@gmail.com>
Diffstat (limited to 'src/mm-sms-list.c')
-rw-r--r-- | src/mm-sms-list.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/src/mm-sms-list.c b/src/mm-sms-list.c index 1a832216..a242105b 100644 --- a/src/mm-sms-list.c +++ b/src/mm-sms-list.c @@ -219,14 +219,23 @@ mm_sms_list_add_sms (MMSmsList *self, /*****************************************************************************/ -static guint -cmp_sms_by_concat_reference (MMBaseSms *sms, - gpointer user_data) +static gint +cmp_sms_by_number_reference (MMBaseSms *sms, + MMSmsPart *part) { if (!mm_base_sms_is_multipart (sms)) return -1; - return (GPOINTER_TO_UINT (user_data) - mm_base_sms_get_multipart_reference (sms)); + if (mm_base_sms_get_multipart_reference (sms) != mm_sms_part_get_concat_reference (part)) + return -1; + + if (g_strcmp0 (mm_gdbus_sms_get_number (MM_GDBUS_SMS (sms)), mm_sms_part_get_number (part))) + return -1; + + if (mm_base_sms_get_max_parts (sms) != mm_sms_part_get_concat_max (part)) + return -1; + + return 0; } typedef struct { @@ -278,9 +287,8 @@ take_multipart (MMSmsList *self, guint concat_reference; concat_reference = mm_sms_part_get_concat_reference (part); - l = g_list_find_custom (self->priv->list, - GUINT_TO_POINTER (concat_reference), - (GCompareFunc)cmp_sms_by_concat_reference); + l = g_list_find_custom (self->priv->list, part, + (GCompareFunc)cmp_sms_by_number_reference); if (l) { /* Try to take the part */ mm_obj_dbg (self, "found existing multipart SMS object with reference '%u': adding new part", concat_reference); |