diff options
author | Dan Williams <dan@ioncontrol.co> | 2025-04-19 19:13:53 -0500 |
---|---|---|
committer | Dan Williams <dan@ioncontrol.co> | 2025-05-08 20:24:38 -0500 |
commit | 97c189910bfb6cf4974a04d34a2e53a8bd1cfdf1 (patch) | |
tree | 28d7325e63911c03a838480212565cbf84b76b9b /src/mm-sms-list.c | |
parent | c6af442053d9959107c73e564731c3cb85e28981 (diff) |
base-sms,sms-list: use signals to set multipart reference
Instead of going through the messaging interface, which just asks
the MMSmsList anyway, just go straight to the list.
Signed-off-by: Dan Williams <dan@ioncontrol.co>
Diffstat (limited to 'src/mm-sms-list.c')
-rw-r--r-- | src/mm-sms-list.c | 76 |
1 files changed, 58 insertions, 18 deletions
diff --git a/src/mm-sms-list.c b/src/mm-sms-list.c index 69c62153..99f35da1 100644 --- a/src/mm-sms-list.c +++ b/src/mm-sms-list.c @@ -61,6 +61,8 @@ struct _MMSmsListPrivate { GList *list; }; +static void _release_sms_internal (MMBaseSms *sms, MMSmsList *self); + /*****************************************************************************/ gboolean @@ -161,7 +163,7 @@ delete_ready (MMBaseSms *sms, path, (GCompareFunc)cmp_sms_by_path); if (l) { - g_object_unref (MM_BASE_SMS (l->data)); + _release_sms_internal (MM_BASE_SMS (l->data), self); self->priv->list = g_list_delete_link (self->priv->list, l); } @@ -213,14 +215,61 @@ mm_sms_list_delete_sms (MMSmsList *self, /*****************************************************************************/ -void -mm_sms_list_add_sms (MMSmsList *self, - MMBaseSms *sms) +static void +set_local_multipart_reference (MMBaseSms *sms, + const gchar *number, + MMSmsList *self) +{ + guint8 reference; + guint8 first; + + /* Start by looking for a random number */ + reference = g_random_int_range (1, 255); + + /* Then, look for the given reference in user-created messages */ + first = reference; + do { + if (!mm_sms_list_has_local_multipart_reference (self, number, reference)) { + mm_base_sms_set_multipart_reference (sms, reference); + return; + } + + if (reference == 255) + reference = 1; + else + reference++; + } while (reference != first); +} + +static void +_release_sms_internal (MMBaseSms *sms, MMSmsList *self) +{ + g_signal_handlers_disconnect_by_func (sms, set_local_multipart_reference, self); + g_object_unref (sms); +} + +static void +_add_sms_internal (MMSmsList *self, + MMBaseSms *sms, + gboolean received) { self->priv->list = g_list_prepend (self->priv->list, g_object_ref (sms)); + g_signal_connect (sms, + MM_BASE_SMS_SET_LOCAL_MULTIPART_REFERENCE, + (GCallback)set_local_multipart_reference, + self); + g_signal_emit (self, signals[SIGNAL_ADDED], 0, mm_base_sms_get_path (sms), - FALSE); + received); +} + + +void +mm_sms_list_add_sms (MMSmsList *self, + MMBaseSms *sms) +{ + _add_sms_internal (self, sms, FALSE); } /*****************************************************************************/ @@ -274,11 +323,7 @@ take_singlepart (MMSmsList *self, return FALSE; mm_obj_dbg (sms, "creating new singlepart SMS object"); - - self->priv->list = g_list_prepend (self->priv->list, g_object_ref (sms)); - g_signal_emit (self, signals[SIGNAL_ADDED], 0, - mm_base_sms_get_path (sms), - state == MM_SMS_STATE_RECEIVED); + _add_sms_internal (self, sms, state == MM_SMS_STATE_RECEIVED); return TRUE; } @@ -316,12 +361,7 @@ take_multipart (MMSmsList *self, mm_obj_dbg (sms, "creating new multipart SMS object: need to receive %u parts with reference '%u'", mm_sms_part_get_concat_max (part), concat_reference); - self->priv->list = g_list_prepend (self->priv->list, g_object_ref (sms)); - g_signal_emit (self, signals[SIGNAL_ADDED], 0, - mm_base_sms_get_path (sms), - (state == MM_SMS_STATE_RECEIVED || - state == MM_SMS_STATE_RECEIVING)); - + _add_sms_internal (self, sms, (state == MM_SMS_STATE_RECEIVED || state == MM_SMS_STATE_RECEIVING)); return TRUE; } @@ -488,8 +528,8 @@ dispose (GObject *object) g_clear_object (&self->priv->modem); g_clear_object (&self->priv->bind_to); - g_list_free_full (self->priv->list, g_object_unref); - self->priv->list = NULL; + g_list_foreach (self->priv->list, (GFunc)_release_sms_internal, self); + g_clear_pointer (&self->priv->list, (GDestroyNotify)g_list_free); G_OBJECT_CLASS (mm_sms_list_parent_class)->dispose (object); } |