diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-base-sms.c | 47 |
1 files changed, 28 insertions, 19 deletions
diff --git a/src/mm-base-sms.c b/src/mm-base-sms.c index 1c291daf..e84ece62 100644 --- a/src/mm-base-sms.c +++ b/src/mm-base-sms.c @@ -361,31 +361,37 @@ handle_store_ready (MMBaseSms *self, } static gboolean -prepare_sms_to_be_stored (MMBaseSms *self, - GError **error) +prepare_sms_to_be_stored (MMBaseSms *self, + GError **error) { - GList *l; - guint8 reference; - - g_assert (self->priv->parts == NULL); - - /* Look for a valid multipart reference to use. When storing, we need to - * check whether we have already stored multipart SMS with the same - * reference and destination number */ - reference = (mm_iface_modem_messaging_get_local_multipart_reference ( - MM_IFACE_MODEM_MESSAGING (self->priv->modem), - mm_gdbus_sms_get_number (MM_GDBUS_SMS (self)), - error)); - if (!reference || - !generate_submit_pdus (self, error)) { - g_prefix_error (error, "Cannot prepare SMS to be stored: "); + /* Create parts if we did not create them already before (e.g. when + * sending) */ + if (!self->priv->parts && !generate_submit_pdus (self, error)) { + g_prefix_error (error, "Cannot create submit PDUs: "); return FALSE; } /* If the message is a multipart message, we need to set a proper * multipart reference. When sending a message which wasn't stored - * yet, we can just get a random multipart reference. */ + * yet, we chose a random multipart reference, but that doesn't work + * when storing locally, as we could collide with the references used + * in other existing messages. */ if (self->priv->is_multipart) { + GList *l; + guint8 reference; + + /* Look for a valid multipart reference to use. When storing, we need to + * check whether we have already stored multipart SMS with the same + * reference and destination number */ + reference = mm_iface_modem_messaging_get_local_multipart_reference ( + MM_IFACE_MODEM_MESSAGING (self->priv->modem), + mm_gdbus_sms_get_number (MM_GDBUS_SMS (self)), + error); + if (!reference) { + g_prefix_error (error, "Cannot get local multipart reference: "); + return FALSE; + } + self->priv->multipart_reference = reference; for (l = self->priv->parts; l; l = g_list_next (l)) { mm_sms_part_set_concat_reference ((MMSmsPart *)l->data, @@ -438,6 +444,7 @@ handle_store_auth_ready (MMBaseModem *modem, /* Prepare the SMS to be stored, creating the PDU list if required */ if (!prepare_sms_to_be_stored (ctx->self, &error)) { + g_prefix_error (&error, "Cannot prepare SMS to be stored: "); g_dbus_method_invocation_take_error (ctx->invocation, error); handle_store_context_free (ctx); return; @@ -546,11 +553,12 @@ prepare_sms_to_be_sent (MMBaseSms *self, { GList *l; + /* If we created the parts when storing, we're fine already */ if (self->priv->parts) return TRUE; if (!generate_submit_pdus (self, error)) { - g_prefix_error (error, "Cannot prepare SMS to be sent: "); + g_prefix_error (error, "Cannot create submit PDUs: "); return FALSE; } @@ -606,6 +614,7 @@ handle_send_auth_ready (MMBaseModem *modem, /* Prepare the SMS to be sent, creating the PDU list if required */ if (!prepare_sms_to_be_sent (ctx->self, &error)) { + g_prefix_error (&error, "Cannot prepare SMS to be sent: "); g_dbus_method_invocation_take_error (ctx->invocation, error); handle_send_context_free (ctx); return; |