diff options
-rw-r--r-- | src/mm-broadband-modem.c | 6 | ||||
-rw-r--r-- | src/mm-iface-modem-messaging.c | 4 | ||||
-rw-r--r-- | src/mm-iface-modem-messaging.h | 2 | ||||
-rw-r--r-- | src/mm-sms-list.c | 87 | ||||
-rw-r--r-- | src/mm-sms-list.h | 2 | ||||
-rw-r--r-- | src/mm-sms.c | 22 |
6 files changed, 67 insertions, 56 deletions
diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c index 5df730ed..90696d8f 100644 --- a/src/mm-broadband-modem.c +++ b/src/mm-broadband-modem.c @@ -3675,7 +3675,7 @@ sms_part_ready (MMBroadbandModem *self, mm_dbg ("Correctly parsed PDU (%d)", ctx->idx); mm_iface_modem_messaging_take_part (MM_IFACE_MODEM_MESSAGING (self), part, - TRUE); + MM_SMS_STATE_RECEIVED); } else { /* Don't treat the error as critical */ mm_dbg ("Error parsing PDU (%d): %s", ctx->idx, error->message); @@ -3932,7 +3932,7 @@ sms_text_part_list_ready (MMBroadbandModem *self, mm_dbg ("Correctly parsed SMS list entry (%d)", idx); mm_iface_modem_messaging_take_part (MM_IFACE_MODEM_MESSAGING (self), part, - FALSE); + MM_SMS_STATE_STORED); next: g_match_info_next (match_info, NULL); } @@ -3993,7 +3993,7 @@ sms_pdu_part_list_ready (MMBroadbandModem *self, mm_dbg ("Correctly parsed PDU (%d)", idx); mm_iface_modem_messaging_take_part (MM_IFACE_MODEM_MESSAGING (self), part, - FALSE); + MM_SMS_STATE_STORED); } else { /* Don't treat the error as critical */ mm_dbg ("Error parsing PDU (%d): %s", idx, error->message); diff --git a/src/mm-iface-modem-messaging.c b/src/mm-iface-modem-messaging.c index b13e1520..68f87497 100644 --- a/src/mm-iface-modem-messaging.c +++ b/src/mm-iface-modem-messaging.c @@ -228,7 +228,7 @@ handle_list (MmGdbusModemMessaging *skeleton, gboolean mm_iface_modem_messaging_take_part (MMIfaceModemMessaging *self, MMSmsPart *sms_part, - gboolean received) + MMSmsState state) { MMSmsList *list = NULL; GError *error = NULL; @@ -238,7 +238,7 @@ mm_iface_modem_messaging_take_part (MMIfaceModemMessaging *self, MM_IFACE_MODEM_MESSAGING_SMS_LIST, &list, NULL); g_assert (list != NULL); - added = mm_sms_list_take_part (list, sms_part, received, &error); + added = mm_sms_list_take_part (list, sms_part, state, &error); if (!added) { mm_dbg ("Couldn't take part in SMS list: '%s'", error->message); g_error_free (error); diff --git a/src/mm-iface-modem-messaging.h b/src/mm-iface-modem-messaging.h index 8a09deb9..20890117 100644 --- a/src/mm-iface-modem-messaging.h +++ b/src/mm-iface-modem-messaging.h @@ -118,6 +118,6 @@ void mm_iface_modem_messaging_bind_simple_status (MMIfaceModemMessaging *self, /* Report new SMS part */ gboolean mm_iface_modem_messaging_take_part (MMIfaceModemMessaging *self, MMSmsPart *sms_part, - gboolean received); + MMSmsState state); #endif /* MM_IFACE_MODEM_MESSAGING_H */ diff --git a/src/mm-sms-list.c b/src/mm-sms-list.c index 44b41668..d0b0b23d 100644 --- a/src/mm-sms-list.c +++ b/src/mm-sms-list.c @@ -194,36 +194,32 @@ cmp_sms_by_part_index (MMSms *sms, return !mm_sms_has_part_index (sms, GPOINTER_TO_UINT (user_data)); } -static void +static gboolean take_singlepart (MMSmsList *self, MMSmsPart *part, - gboolean received) + MMSmsState state, + GError **error) { MMSms *sms; - GError *error = NULL; sms = mm_sms_singlepart_new (self->priv->modem, - (received ? - MM_SMS_STATE_RECEIVED : - MM_SMS_STATE_STORED), + state, part, - &error); - - if (!sms) { - mm_warn ("Couldn't create single-part SMS: '%s'", error->message); - g_error_free (error); - } else { - self->priv->list = g_list_prepend (self->priv->list, sms); - g_signal_emit (self, signals[SIGNAL_ADDED], 0, - mm_sms_get_path (sms), - received); - } + error); + if (!sms) + return FALSE; + + self->priv->list = g_list_prepend (self->priv->list, sms); + g_signal_emit (self, signals[SIGNAL_ADDED], 0, + mm_sms_get_path (sms), + state == MM_SMS_STATE_RECEIVED); + return TRUE; } static gboolean take_multipart (MMSmsList *self, MMSmsPart *part, - gboolean received, + MMSmsState state, GError **error) { GList *l; @@ -234,32 +230,32 @@ take_multipart (MMSmsList *self, l = g_list_find_custom (self->priv->list, GUINT_TO_POINTER (concat_reference), (GCompareFunc)cmp_sms_by_concat_reference); - if (l) { - sms = MM_SMS (l->data); + if (l) /* Try to take the part */ - if (!mm_sms_multipart_take_part (sms, part, error)) - return FALSE; - } else { - /* Create new Multipart */ - sms = mm_sms_multipart_new (self->priv->modem, - (received ? - MM_SMS_STATE_RECEIVED : - MM_SMS_STATE_STORED), - concat_reference, - mm_sms_part_get_concat_max (part), - part, - error); - if (!sms) - return FALSE; - - self->priv->list = g_list_prepend (self->priv->list, sms); - } + return mm_sms_multipart_take_part (MM_SMS (l->data), part, error); + + /* Create new Multipart */ + sms = mm_sms_multipart_new (self->priv->modem, + state, + concat_reference, + mm_sms_part_get_concat_max (part), + part, + error); + if (!sms) + return FALSE; - /* Check if completed and assembled */ - if (mm_sms_multipart_is_complete (sms) && - mm_sms_multipart_is_assembled (sms)) - g_signal_emit (self, signals[SIGNAL_ADDED], 0, - mm_sms_get_path (sms)); + /* We do export uncomplete multipart messages, in order to be able to + * request removal of all parts of those multipart SMS that will never + * get completed. + * Only the STATE of the SMS object will be valid in the exported DBus + * interface.*/ + mm_sms_export (sms); + + self->priv->list = g_list_prepend (self->priv->list, sms); + g_signal_emit (self, signals[SIGNAL_ADDED], 0, + mm_sms_get_path (sms), + (state == MM_SMS_STATE_RECEIVED || + state == MM_SMS_STATE_RECEIVING)); return TRUE; } @@ -267,7 +263,7 @@ take_multipart (MMSmsList *self, gboolean mm_sms_list_take_part (MMSmsList *self, MMSmsPart *part, - gboolean received, + MMSmsState state, GError **error) { /* Ensure we don't have already taken a part with the same index */ @@ -284,11 +280,10 @@ mm_sms_list_take_part (MMSmsList *self, /* Did we just get a part of a multi-part SMS? */ if (mm_sms_part_should_concat (part)) - return take_multipart (self, part, received, error); + return take_multipart (self, part, state, error); /* Otherwise, we build a whole new single-part MMSms just from this part */ - take_singlepart (self, part, received); - return TRUE; + return take_singlepart (self, part, state, error); } /*****************************************************************************/ diff --git a/src/mm-sms-list.h b/src/mm-sms-list.h index 609f1173..239ed657 100644 --- a/src/mm-sms-list.h +++ b/src/mm-sms-list.h @@ -63,7 +63,7 @@ guint mm_sms_list_get_count (MMSmsList *self); gboolean mm_sms_list_take_part (MMSmsList *self, MMSmsPart *part, - gboolean received, + MMSmsState state, GError **error); void mm_sms_list_add_sms (MMSmsList *self, diff --git a/src/mm-sms.c b/src/mm-sms.c index 54fa4dbd..88a9ad3d 100644 --- a/src/mm-sms.c +++ b/src/mm-sms.c @@ -562,9 +562,20 @@ mm_sms_multipart_take_part (MMSms *self, mm_warn ("Couldn't assemble SMS: '%s'", inner_error->message); g_error_free (inner_error); - } else - /* Only export once properly assembled */ - mm_sms_export (self); + } else { + /* Completed AND assembled */ + MMSmsState state = MM_SMS_STATE_UNKNOWN; + + /* Change state RECEIVING->RECEIVED, and signal completeness */ + g_object_get (self, + "state", &state, + NULL); + if (state == MM_SMS_STATE_RECEIVING) { + g_object_set (self, + "state", MM_SMS_STATE_RECEIVED, + NULL); + } + } } return TRUE; @@ -613,6 +624,11 @@ mm_sms_multipart_new (MMBaseModem *modem, { MMSms *self; + /* If this is the first part of a RECEIVED SMS, we overwrite the state + * as RECEIVING, to indicate that it is not completed yet. */ + if (state == MM_SMS_STATE_RECEIVED) + state = MM_SMS_STATE_RECEIVING; + self = mm_sms_new (modem); g_object_set (self, MM_SMS_IS_MULTIPART, TRUE, |