aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mm-base-sms.c47
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;